Как получить совпадающую и несовпадающую строку из списка - PullRequest
0 голосов
/ 10 июля 2020

public class MyTest {

    public static void main(String args[]) {
        List<String> list1 = new ArrayList<String>();
        list1.add("Soumya Ranjan Das");
        list1.add("Test");

        List<String> list2 = new ArrayList<String>();
        list2.add("Soumya Das Ranjan");
        list2.add("Something");

        list1.retainAll("matching ----" + list2);
        System.out.println(list1);
    }
}
  1. см. Приведенный выше код, в котором я пытаюсь получить совпадающие данные, не имеет значения, содержит ли моя строка какое-либо случайное значение.
  2. Я ожидаю, что соответствующий результат должен быть «Сумья дас Ранджан» и несоответствие должны быть «Что-то» и «Тест»

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы можете преобразовать список в Map<String, Set<String>> после преобразования каждой строки в char [], а затем отсортировать этот массив символов

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("Soumya Ranjan Das");
        list1.add("Test");

        List<String> list2 = new ArrayList<>();
        list2.add("Soumya Das Ranjan");
        list2.add("Something");

        Collector<String, ?, Map<String, Set<String>>> groupingBy = Collectors.groupingBy(String::toString,
                Collectors.mapping(obj -> {
                    char[] arr = obj.toString().toCharArray();
                    Arrays.sort(arr);
                    return new String(arr);
                }, Collectors.toSet()));

        Map<String, Set<String>> collect = list1.stream().collect(groupingBy);
        Map<String, Set<String>> collect2 = list2.stream().collect(groupingBy);

        // Check if any elements from collect exists in collect2
        collect.entrySet().stream().filter(entry -> collect2.values().contains(entry.getValue())).forEach(entry -> {
            System.out.println(entry.getKey());
        }); // prints Soumya Ranjan Das

        // Check if any elements from collect not exists in collect2
        collect.entrySet().stream().filter(entry -> !collect2.values().contains(entry.getValue())).forEach(entry -> {
            System.out.println(entry.getKey());
        }); // prints Test
    }
0 голосов
/ 10 июля 2020

Вы должны обработать строки в своих списках, чтобы иметь возможность сравнивать любую последовательность слов, которые они содержат.

Вы можете добиться этого, преобразовав строку в набор строк для каждого списка, найдя пересечение и / или различие между этими списками с последующим перестроением строк из наборов:

private static List<Set<String>> convert(List<String> list) {
    return list.stream()
               .map(s -> Arrays.stream(s.split(" "))   // split string
                        .collect(Collectors.toCollection(LinkedHashSet::new))) // build set
               .collect(Collectors.toList()); // get list of sets
}

private static List<String> deconvert(List<Set<String>> listSets) {
    return listSets.stream()
                   .map(set -> String.join(" ", set)) // join strings in the set
                   .collect(Collectors.toList()); // get list of strings
}

// test
List<String> list1 = new ArrayList<>();
list1.add("Soumya Ranjan Das");
list1.add("Test");

List<String> list2 = new ArrayList<>();
list2.add("Soumya Das Ranjan");
list2.add("Something");

List<Set<String>> listSets1 = convert(list1);
List<Set<String>> listSets2 = convert(list2);

// intersection
listSets1.retainAll(listSets2);
System.out.println("similar elements: " + deconvert(listSets1));

List<Set<String>> listSets3 = convert(list1);
List<Set<String>> listSets4 = convert(list2);

// union of two lists
listSets3.addAll(listSets4);
// union - intersection = difference
listSets3.removeAll(listSets1);
System.out.println("different elements: " + deconvert(listSets3));

вывод:

similar elements: [Soumya Ranjan Das]
different elements: [Test, Something]
...