我是Java新手:)
我有2个字符串列表,我想知道比较两者的最有效方法是什么,并且得到一个包含不在另一个中的字符串的结果数组。例如,我有一个名为oldStrings的列表和一个名为Strings的列表。我已经看过Comparator函数但是没有完全理解它是如何工作的,现在我以为我可以创建一个for循环,循环遍历每个字符串然后保存该字符串:
for (final String str : oldStrings) {
if(!strings.contains(str))
{
getLogger().info(str + " is not in strings list ");
}
}
此列表中最多可包含200个字符串。这是最好的解决方法吗?谢谢!
答案 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]