Java 字符串列表比较器

Java 字符串列表比较器,java,string,list,Java,String,List,我对Java是全新的:) 我有两个字符串列表,我想知道什么是比较这两个列表的最有效的方法,并得到一个包含不在另一个列表中的字符串的数组。例如,我有一个名为oldStrings的列表和一个名为Strings的列表。我看过Comparator函数,但不完全理解它是如何工作的,现在我想我可以创建一个for循环,循环每个字符串,然后保存该字符串: for (final String str : oldStrings) { if(!strings.contains(str)) {

我对Java是全新的:)

我有两个字符串列表,我想知道什么是比较这两个列表的最有效的方法,并得到一个包含不在另一个列表中的字符串的数组。例如,我有一个名为oldStrings的列表和一个名为Strings的列表。我看过Comparator函数,但不完全理解它是如何工作的,现在我想我可以创建一个for循环,循环每个字符串,然后保存该字符串:

for (final String str : oldStrings) {
  if(!strings.contains(str))
  {                     
    getLogger().info(str + " is not in strings list ");
  }
}
这个列表中最多有200个字符串。这是最好的办法吗?谢谢大家!

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);  
Collection firstList=new ArrayList();
第一个列表。添加(“str1”);
第一个列表。添加(“str2”);
Collection secondList=new ArrayList();
第二个列表。添加(“str1”);
第二个列表。添加(“str2”);
第二个列表。添加(“str3”);
System.out.println(“第一个列表:+firstList”);
System.out.println(“第二个列表:+secondList”);
//这里是主要部分
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);
Set setOne=new HashSet();
Set setTwo=新的HashSet();
setOne.添加(“1”);
setOne.添加(“2”);
setOne.添加(“5”);
第二组。添加(“1”);
第二组。添加(“3”);
第二组。添加(“4”);
Set settwodumy=新哈希集(setTwo);
第二组。保留(第一组);
settwomdummy.addAll(setOne);
settwoom.removeAll(settwoo);
System.out.println(“+setTwoDummy”);

首先,您的解决方案的问题是,它只会查找
旧字符串中的元素,而不会查找
字符串中的元素。如果您使用这种方法,那么您还需要循环其他列表

如果这不是家庭作业,请检查CollectionUtils.disconction from

比较两个字符串列表并进行比较 包含字符串的结果数组 那不是另一个

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

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

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


你应该使用谷歌番石榴的实用程序

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]
Set s=Set.newHashSet(“a”、“b”、“c”、“d”);
Set t=Set.newHashSet(“f”、“g”、“a”、“c”);
Sets.SetView差异=Sets.difference(s,t);
System.out.println(差异);//印刷品[b,d]

这是家庭作业吗?如果是这样,请将其标记为这样,以便我们能够做出适当的响应。它不是,它实际上是我为Wowza编写的一个模块,字符串列表将包含不同的流:)@javamonkey79:现在不鼓励使用家庭作业标记。@Mark:我不知道。是否有相关的讨论?TIA@javamonkey79当前位置有。但是这仍然是一个悬而未决的问题(),所以对我所说的话持保留态度。我的观点是,我们不应该强迫OP将其标记为家庭作业,也不应该为他们这样做。啊,不,我讨厌这个习惯用法(你如何填充列表)!它是ArrayList的子类,将新的具体类添加到类库中,这些类必须由类加载器单独加载,以节省一些字符。我知道这与您实际想要显示的内容不符,所以我没有进行d/v,但在我看来这是非常糟糕的做法,不应该向易受攻击的人显示:-)。除非我没有抓住问题的关键,否则此解决方案不会打印不在第二个列表中的“str2”吗?我以为这个想法是为了得到2之间的区别,即:'str2','str3','str4'@Mark:在ArrayList的情况下,我完全同意你的观点,因为你总是可以在构造函数中填充数组.asList(…)。@javamonkey79:我认为这个习惯用法几乎可以用于任何集合,对吗?除了一张
地图
?@Mark:这就是我想说的-我唯一一次使用上面的方法是使用地图,因为它们没有简单的方法(据我所知)用元素来构造它们。你不需要交叉点列表。只需执行
oldStrings.removeAll(strings)
strings.removeAll(oldStrings)
,然后将一个添加到另一个。使用intersectionList所做的一切就是确保不会从旧字符串中删除任何不在旧字符串中的内容…这无论如何都不会发生。old=[1,2,3,4,5],current=[3,4,5,6],old.removeAll(current)=>old=[1,2],current.removeAll(old)=>current=[3,4,5,6]。这不对吗?哦,对不起,是的,你完全正确。我应该说,intersectionList实际上是否包含交叉点,或者在本例中仅包含oldStrings的副本并不重要(
oldStrings.removeAll(strings);strings.removeAll(OldStringScope)
)。如果您要手动构建一个列表,为什么不颠倒逻辑,直接构建析取呢?(
如果(!strings.contains(str)){disjunct.add(str);}
)析取看起来不那么清晰,但它确实看起来更快(少了一个removeAll)。您仍然需要断开连接。添加(strings.removeAll(oldStrings))。我考虑了更多的两个循环,第二个循环交换
strings
oldStrings
的角色。这样就不需要重新安装。
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]