我有一个名为test1.txt的文本文件,我想删除所有重复项。这意味着只有唯一的单词在那里。
例。
test1.txt:
hello i am a businessman i am also a student
输出应为:
hello businessman also student
我的方法是这样的:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class main {
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("test1.txt"));
ArrayList<String> list1 = new ArrayList<String>();
while (input.hasNext()) {
list1.add(input.next());
}
for(int i=0;i<list1.size();i++){
for(int j=i+1;j<list1.size();j++){
if(list1.get(i).equals(list1.get(j))){
list1.remove(j);
j--;
}
}
}
System.out.println("List 1: " + list1);
}
}
但这不是我想要的。我想删除所有重复的出现,以便我只能输出唯一的单词。
最佳答案
您需要的是Set接口的实现。 Java提供了多个:
HashSet:此实现不维护任何顺序
TreeSet:此实现保持自然顺序(字符串的字典比较,数字的递增顺序等)
LinkedHashSet:此实现维护插入顺序。
就像其他人提到的那样,这似乎是一个明确的作业问题。因此,我不会为您编写解决方案的代码。但是,我将向您展示一个可行的示例算法。
步骤1:打开文件以逐个读取单词。
步骤2:声明两组,一组用于存储所有单词,另一组用于存储重复项。
步骤3:逐个阅读单词,然后尝试将其插入第一组。 Java的set的add方法会根据插入成功或失败返回一个布尔值,表示为true或false。
步骤4:尝试插入第一组。
步骤4.1:如果插入通过,则表示该单词到目前为止从未遇到过。移至下一个单词,然后再次执行步骤4。
步骤4.2:如果插入失败,则意味着该单词已经在前面出现过,因此我们不应将其包含在最终列表中。因此放在第二个列表中。继续下一个单词,然后再次执行步骤4。
步骤5:完成所有单词后,您将在第一组(集合A)中拥有一组唯一的单词,并且在该段落中出现了不止一次的一组单词。 (设置B)。
步骤6:执行A-B(A中所有单词的集合,但B中不包括)
步骤7:以上结果使所有单词只出现一次。
请注意,这只是该解决方案的一种算法。还有其他使用其他数据结构的解决方案。 (您可以使用HasMap,在其中您可以将每个单词映射到它出现的次数,然后将所有出现的单词打印一次。)还要注意,您也可以使用ArrayLists实现上述解决方案。弄清楚这些工作原理,您将真正学到一些东西。