Компаратор для списка строк - PullRequest
0 голосов
/ 18 ноября 2010

Я новичок в Java:)

У меня есть 2 списка строк, и мне было интересно, как можно было бы наиболее эффективно сравнить их и получить результирующий массив, содержащий строки, которых нет вДругой.Например, у меня есть список с именем oldStrings и список с именем Strings.Я видел функцию Comparator, но не до конца понимаю, как она работает, сейчас я думал, что мог бы создать цикл for, пройти по каждой строке и затем сохранить эту строку:

for (final String str : oldStrings) {
  if(!strings.contains(str))
  {                     
    getLogger().info(str + " is not in strings list ");
  }
}

быть до 200 строк в этом списке.Будет ли это лучший способ пойти по этому поводу?Спасибо!

Ответы [ 4 ]

8 голосов
/ 18 ноября 2010
Collection firstList = new ArrayList() {{
    add("str1");
    add("str2");
}};

Collection secondList = new ArrayList() {{
    add("str1");
    add("str3");
    add("str4");
}};


System.out.println("First List: " + firstList);
System.out.println("Second List: " + secondList);

// Here is main part
secondList.removeAll(firstList);

System.out.println("Result: " + secondList);  

Обновление: Более сложная версия кода

Collection<String> firstList = new ArrayList<String>();
firstList.add("str1");
firstList.add("str2");

Collection<String> secondList = new ArrayList<String>();
secondList.add("str1");
secondList.add("str2");
secondList.add("str3");


System.out.println("First List: " + firstList);
System.out.println("Second List: " + secondList);

// Here is main part
secondList.removeAll(firstList);  

Обновление:

Для получения фактической разницы между обоими списками строкпойти на это.

    Set<String> setOne = new HashSet<String>();        
    Set<String> setTwo = new HashSet<String>();
    setOne.add("1");
    setOne.add("2");
    setOne.add("5");
    setTwo.add("1");
    setTwo.add("3");
    setTwo.add("4");
    Set<String> setTwoDummy = new HashSet<String>(setTwo);
    setTwo.retainAll(setOne);        
    setTwoDummy.addAll(setOne);
    setTwoDummy.removeAll(setTwo);
    System.out.println(""+setTwoDummy);
4 голосов
/ 18 ноября 2010

Во-первых, проблема с вашим решением состоит в том, что оно найдет только элементы, которые находятся в oldStrings, а не strings.Если вы придерживаетесь этого подхода, то вам нужно выполнить цикл и по другому списку.

Если это не домашнее задание, тогда посмотрите CollectionUtils.disjunction из Apache Commons Collections .

1 голос
/ 18 ноября 2010

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

Описание неоднозначно, потому что мы не знаем,нам нужны просто несоответствующие строки из первого списка, второго списка или обоих.Ниже приведен псевдокод для обоих.

for (String str : oldStrings)
{
  if(strings.contains(str))
  {
    intersectionList.add(str);
  }
}

oldStrings.removeAll(intersectionList);
strings.removeAll(intersectionList);
result = strings.addAll(oldStrings).toArray();

Или

copyStrings = strings.clone();
strings.removeAll(oldStrings);
oldStrings.removeAll(copyStrings);
result = strings.addAll(oldStrings).toArray();
0 голосов
/ 22 мая 2011

Вам следует использовать утилиты Google Guava Sets.

Set<String> s = Sets.newHashSet("a", "b", "c", "d");
Set<String> t = Sets.newHashSet("f", "g", "a", "c");
Sets.SetView<String> difference = Sets.difference(s, t);
System.out.println(difference); // prints [b, d]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...