代码之家  ›  专栏  ›  技术社区  ›  Doug Molineux

字符串列表比较器

  •  0
  • Doug Molineux  · 技术社区  · 15 年前

    我对Java是全新的:

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

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

    这个列表中最多有200个字符串。这是最好的方法吗?谢谢您!

    4 回复  |  直到 15 年前
        1
  •  8
  •   Jigar Joshi    15 年前
    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);
    
        2
  •  4
  •   javamonkey79    15 年前

    首先,您的解决方案的问题是它只会找到 oldStrings 而不是 strings . 如果您要使用这种方法,那么您还需要在另一个列表上循环。

    如果这不是作业,请检查collectionUtils.disjunction Apache Commons Collections 。

        3
  •  1
  •   Thomas Langston    15 年前

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

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

    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();
    
        4
  •  0
  •   missingfaktor Kevin Wright    15 年前

    你应该用谷歌的番石榴 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]