我正在尝试比较两个要检查重复项的列表。如果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,
答案 0 :(得分:1)
似乎你不明白String
和Collections
的工作方式。
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
变量转换为行列表。