首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回列表中的项

返回列表中的项
EN

Stack Overflow用户
提问于 2020-07-17 19:47:34
回答 2查看 227关注 0票数 2

给定字符串列表,返回包含不同值的列表。换句话说,在返回的列表中不包含超过一次的值。(提示:思维定势)

distinctValues( ["red", "yellow", "green", "yellow", "blue", "green", "purple"] ) -> ["red", "yellow", "green", "blue", "purple"]

distinctValues( ["jingle", "bells", "jingle", "bells", "jingle", "all", "the", "way"] ) -> ["jingle", "bells", "all", "the", "way"]

我的守则:

代码语言:javascript
复制
public List<String> distinctValues(List<String> stringList) {
        
        Map<String, String> distinctValuesMap = new HashMap<String, String>();
         
        for (int i= 0; i < stringList.size(); i++) {
            distinctValuesMap.put(stringList.get(i), stringList.get(i));
            
        }
        Set<String>distinctValuesSet = distinctValuesMap.keySet();
        List<String>distinctValues = new ArrayList<String>(distinctValuesSet);
        System.out.println(distinctValues);
        
        return distinctValues;
    }

预期结果:红色,黄色,绿色,蓝色,紫色我的结果:红色,绿色,蓝色,黄色,紫色

不知道我哪里出了问题,但我尝试了不同的方法,无法得到预期的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-17 19:57:35

因为您使用的是无序集合,所以Set**.**插入顺序正在丢失。插入顺序保存在数据结构中,比如LinkedList (以及它的集合变量LinkedHashSet或映射变体LinkedHashMap)。

在LinkedHashSet或LinkedHashMap上使用LinkedList的优点是,在插入时,当执行重复检查时,在LinkedHashSet或LinkedHashMap中执行检查时是O(1),而LinkedList是O(n)。

您也可以使用Java 8 stream.distinct()实现相同的功能。

以下是几个选择:

代码语言:javascript
复制
public class MyApp {
  public static void main(String[] args) {

    List myList = Arrays.asList("red", "yellow", "green", "yellow", "blue", "green", "purple");
    distinctValuesUsingStreamDistinct(myList).forEach(System.out::println);

    System.out.println("==============");

    distinctValuesUsingLinkedHashSet(myList).forEach(System.out::println);
  }

  public static List<String> distinctValuesUsingStreamDistinct(List<String> stringList) {
    return stringList.stream().distinct().collect(Collectors.toList());
  }

  public static List<String> distinctValuesUsingLinkedHashSet(List<String> stringList) {
    LinkedHashSet<String> setSortedByInsertionOrder = new LinkedHashSet<String>();
    stringList.forEach(str -> setSortedByInsertionOrder.add(str));
    return new ArrayList<>(setSortedByInsertionOrder);
  }
}
票数 2
EN

Stack Overflow用户

发布于 2020-07-18 01:25:47

Stream::distinct

只需使用Java流distinct从列表中获取一个不同的元素列表,同时保留原始顺序。

在一行代码中。

代码语言:javascript
复制
List<String> result = list.stream().distinct().collect(Collectors.toList());

或者多行。

代码语言:javascript
复制
List<String> result = 
    list
    .stream()
    .distinct()
    .collect(
        Collectors.toList()
    )
;

看这个在IdeOne.com现场运行的代码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62960848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档