比较list1和list2,从list2中删除重复(不使用removeAll())

时间:2014-12-18 11:34:04

标签: java

我正在尝试比较两个要检查重复项的列表。如果list1和list2包含相同的副本,则应删除list2中的副本。

如果我比较两个.txt文件或者list1是.txt文件而list2是硬编码的,我就能解决问题。因此,如果:

list1包含来自.txt文件的内容(类似于模板),list2从另一个地方获取,我的代码将无效。

下面你可以看到我的代码:

public static String removeLinesFromTemplate(String text) throws IOException{
    final List<String> list = new ArrayList<String>();
    final List<String> list2 = new ArrayList<String>();

    // New BufferedReader.
    final BufferedReader reader = new BufferedReader(new FileReader("testing"));

    //Add all lines from the file testing to the arraylist.
    String row;
    while ((row = reader.readLine()) != null) {
       list.add(row.toLowerCase());
    }
    // Close it.
    reader.close();

    System.out.println(list);

    list2.add(text.toLowerCase());

    //If two lines matches between list2 and list, then that line will be removed from list2.
    list2.removeAll(list);

    System.out.println(list2);

    // Convert the list into string
    String listString = "";
    for (String s : list2){
        listString += s ;
    }

    return listString;
}

似乎我的list2.removeAll(list)将无效并删除重复项。任何想法,以及如何解决

我试过@ SeniorJD的option3

String[] parts = text.split("\\s+");
for(String item : parts){
  list2.add(item.toLowerCase());
}

问题仍然存在,例如: list1:1只猴子,-------,(list1的输入) list2:1 monkey,-------,asdf,(list2的输入)

现在问题是1只猴子没有被移除,而“------”被移除。

所以list2的输出是:1 monkey,asdf,

2 个答案:

答案 0 :(得分:1)

似乎你不明白StringCollections的工作方式。

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();

list1.add("a");
list1.add("b");

// #way1 - would not work
list2.add("a b c");
list2.removeAll(list1);

// #way2 - would work
list2.add("a");
list2.add("b");
list2.add("c");
list2.removeAll(list1);

// #way3 - would work as well
String text = "a b c";
String[] parts = text.split("\\s+");
for (String part: parts) {
    list2.add(part);
}
list2.removeAll(list1);

<强>为什么吗

String是一组字符,List是一组对象(在我们的示例中 - 字符串对象)。当你尝试#way1时,list2会查找它已经拥有的相等对象。 "a b c"不等于"a""b"。所以它不像你预期的那样工作。尝试#way2并对其进行调试,然后首先了解Java Core

答案 1 :(得分:0)

您的list2只包含一个元素(全文)。 list的元素是解析文件中的行。因此,为了使removeAll工作,您需要将text变量转换为行列表。