Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列表拆分为重复列表和非重复列表Java 8_Java_Arrays_Performance_Java Stream - Fatal编程技术网

将列表拆分为重复列表和非重复列表Java 8

将列表拆分为重复列表和非重复列表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

我有一个可能包含或不包含重复值的列表:

在重复ABC值的情况下,仅ABC用于此事项 列表myList={ABC,EFG,IJK,ABC,ABC}

我想将列表拆分为两个列表,以最终获得 列出重复的值={ABC}; 和 列出非重复的值={EFG,IJK}

而且,如果列表中没有多个ABC,它将返回相同的列表

到目前为止我所做的:

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上吗?您需要提升频率呼叫,以便只执行一次。