给定字符串列表,返回包含不同值的列表。换句话说,在返回的列表中不包含超过一次的值。(提示:思维定势)
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"]
我的守则:
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;
}预期结果:红色,黄色,绿色,蓝色,紫色我的结果:红色,绿色,蓝色,黄色,紫色
不知道我哪里出了问题,但我尝试了不同的方法,无法得到预期的结果。
发布于 2020-07-17 19:57:35
因为您使用的是无序集合,所以Set**.**插入顺序正在丢失。插入顺序保存在数据结构中,比如LinkedList (以及它的集合变量LinkedHashSet或映射变体LinkedHashMap)。
在LinkedHashSet或LinkedHashMap上使用LinkedList的优点是,在插入时,当执行重复检查时,在LinkedHashSet或LinkedHashMap中执行检查时是O(1),而LinkedList是O(n)。
您也可以使用Java 8 stream.distinct()实现相同的功能。
以下是几个选择:
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);
}
}发布于 2020-07-18 01:25:47
Stream::distinct
只需使用Java流distinct从列表中获取一个不同的元素列表,同时保留原始顺序。
在一行代码中。
List<String> result = list.stream().distinct().collect(Collectors.toList());或者多行。
List<String> result =
list
.stream()
.distinct()
.collect(
Collectors.toList()
)
;https://stackoverflow.com/questions/62960848
复制相似问题