字符串列表的比较器

时间:2010-11-18 17:29:12

标签: java string list

我是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 个答案:

答案 0 :(得分:8)

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);

答案 1 :(得分:4)

首先,您的解决方案的问题是它只会找到oldStrings而非strings中的元素。如果你采用这种方法,那么你也需要在另一个列表上循环。

如果这不适用于家庭作业,请查看Apache Commons Collections中的CollectionUtils.disjunction。

答案 2 :(得分:1)

  

比较两个字符串列表并有一个   结果包含字符串的数组   那些不在另一个。

描述不明确,因为我们不知道是否只需要来自第一个列表,第二个列表或两者的非匹配字符串。以下是两者的伪代码。

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();

答案 3 :(得分:0)

您应该使用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]