将列表拆分为重复列表和非重复列表Java 8
我有一个可能包含或不包含重复值的列表: 在重复ABC值的情况下,仅ABC用于此事项 列表myList={ABC,EFG,IJK,ABC,ABC} 我想将列表拆分为两个列表,以最终获得 列出重复的值={ABC}; 和 列出非重复的值={EFG,IJK} 而且,如果列表中没有多个ABC,它将返回相同的列表 到目前为止我所做的:将列表拆分为重复列表和非重复列表Java 8,java,arrays,performance,java-stream,Java,Arrays,Performance,Java Stream,我有一个可能包含或不包含重复值的列表: 在重复ABC值的情况下,仅ABC用于此事项 列表myList={ABC,EFG,IJK,ABC,ABC} 我想将列表拆分为两个列表,以最终获得 列出重复的值={ABC}; 和 列出非重复的值={EFG,IJK} 而且,如果列表中没有多个ABC,它将返回相同的列表 到目前为止我所做的: void generateList(List<String> duplicatedValues, List<String> nonDuplicated
void generateList(List<String> duplicatedValues, List<String> nonDuplicatedValues){
List<String> myList=List.of("ABC","EFG","IJK","ABC","ABC");
Optional<String> duplicatedValue = myList.stream().filter(isDuplicated -> Collections.frequency(myList, "ABC") > 1).findFirst();
if (duplicatedValue.isPresent())
{
duplicatedValues.addAll(List.of(duplicatedValue.get()));
nonDuplicatedValues.addAll(myList.stream().filter(string->string.equals("ABC")).collect(Collectors.toList()));
}
else
{
nonDuplicatedValues.addAll(myList);
}
}
有没有更有效的方法只使用myList流来实现这一点?您可以这样做:
myList.stream().forEach((x) -> ((Collections.frequency(myList, x) > 1) ? duplicatedValues : nonDuplicatedValues).add(x));
DuplicatedValue应该设置为防止重复您可以执行以下操作:
myList.stream().forEach((x) -> ((Collections.frequency(myList, x) > 1) ? duplicatedValues : nonDuplicatedValues).add(x));
DuplicatedValue应该设置为防止重复也可以通过收集重复和非重复值列表来完成:
Map<Boolean, List<String>> result = input.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(s -> s, Collectors.counting()),
m -> m.entrySet().stream()
.collect(Collectors.groupingBy(e -> e.getValue() > 1,
Collectors.mapping(e -> e.getKey(), Collectors.toList()))
)
));
List<String> duplicates = result.get(true);
List<String> nonDuplicates = result.get(false);
也可以通过收集重复和非重复值列表来完成:
Map<Boolean, List<String>> result = input.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(s -> s, Collectors.counting()),
m -> m.entrySet().stream()
.collect(Collectors.groupingBy(e -> e.getValue() > 1,
Collectors.mapping(e -> e.getKey(), Collectors.toList()))
)
));
List<String> duplicates = result.get(true);
List<String> nonDuplicates = result.get(false);
可以使用流从您的列表创建一个映射,存储列表中的字符串及其频率;在可以迭代映射以将元素放入重复值和非重复值列表后,如下所示:
List<String> duplicatedValues = new ArrayList<String>();
List<String> nonDuplicatedValues = new ArrayList<String>();
List<String> myList=List.of("ABC","EFG","IJK","ABC","ABC");
Map<String, Long> map = myList.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
map.forEach((k, v) -> { if (v > 1) duplicatedValues.add(k); else nonDuplicatedValues.add(k); });
可以使用流从您的列表创建一个映射,存储列表中的字符串及其频率;在可以迭代映射以将元素放入重复值和非重复值列表后,如下所示:
List<String> duplicatedValues = new ArrayList<String>();
List<String> nonDuplicatedValues = new ArrayList<String>();
List<String> myList=List.of("ABC","EFG","IJK","ABC","ABC");
Map<String, Long> map = myList.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
map.forEach((k, v) -> { if (v > 1) duplicatedValues.add(k); else nonDuplicatedValues.add(k); });
这里有一种方法。它基本上进行频率计数并相应地进行除法
List<String> myList = new ArrayList<>(
List.of("ABC", "EFG", "IJK", "ABC", "ABC", "RJL"));
Map<String,Long> freq = new HashMap<>();
for (String str : myList) {
freq.compute(str, (k,v)->v == null ? 1 : v + 1);
}
Map<String,List<String>> dupsAndNonDups = new HashMap<>();
for (Entry<String,Long> e : freq.entrySet()) {
dupsAndNonDups.computeIfAbsent(e.getValue() > 1 ? "dups" : "nondups",
k-> new ArrayList<>()).add(e.getKey());
}
System.out.println("dups = " + dupsAndNonDups.get("dups"));
这里有一种方法。它基本上进行频率计数并相应地进行除法
List<String> myList = new ArrayList<>(
List.of("ABC", "EFG", "IJK", "ABC", "ABC", "RJL"));
Map<String,Long> freq = new HashMap<>();
for (String str : myList) {
freq.compute(str, (k,v)->v == null ? 1 : v + 1);
}
Map<String,List<String>> dupsAndNonDups = new HashMap<>();
for (Entry<String,Long> e : freq.entrySet()) {
dupsAndNonDups.computeIfAbsent(e.getValue() > 1 ? "dups" : "nondups",
k-> new ArrayList<>()).add(e.getKey());
}
System.out.println("dups = " + dupsAndNonDups.get("dups"));
你知道这是在^2上吗?您需要挂起频率呼叫,以便只执行一次。您知道这是在^2上吗?您需要提升频率呼叫,以便只执行一次。