我一直在努力学习使用HashSets删除输出中的重复元素但我遇到了麻烦。
我的目标是在程序运行时选择一个文本文件,并显示文本文件的单词,不带重复项,标点符号或大写字母。所有这些都可以正常工作,除了删除重复项。
这是我第一次使用像这样的Set。有关我失踪的建议吗?谢谢!
部分文本文件输入例如:"四个分数和七年前我们的父亲在这个大陆上建立了一个新的国家,在自由中孕育,并致力于人人生而平等的主张。现在,我们正在进行一场伟大的内战,检验那个国家,或任何国家,如此构想和如此奉献,能够长久忍受"
import java.util.Scanner;
import java.util.List;
import java.io.*;
import java.util.*;
import javax.swing.JFileChooser;
public class Lab7 {
public interface OrderedList<T extends Comparable<T>> extends Iterable<T>
{
public void add(T element);
public T removeFront();
public T removeRear();
public int size();
public boolean isEmpty();
public boolean contains(T element);
public Iterator<T> iterator();
}
public static void main(String[] arg) throws FileNotFoundException
{
Scanner scan = null;
JFileChooser chooser = new JFileChooser("../Text");
int returnValue = chooser.showOpenDialog(null);
if( returnValue == JFileChooser.APPROVE_OPTION)
{
File file = chooser.getSelectedFile();
scan = new Scanner(file);
}
else
return;
int count = 0;
Set<String> set = new LinkedHashSet<String>();
while(scan.hasNext())
{
String[] noDuplicate = {scan.next().replaceAll("[\\W]", "").toLowerCase()};
List<String> list = Arrays.asList(noDuplicate);
set.addAll(list);
count++;
}
scan.close();
System.out.println(set);
System.out.println();
System.out.println(chooser.getName() + " has " + count + " words.");
}
}
答案 0 :(得分:0)
您的问题是,每次使用扫描仪读取单词时都会创建new
HashSet,因此没有机会进行重复数据删除。您可以使用以下步骤进行修复。此外,正常HashSet
不会保留排序。
set.add(item);
。正如另一个答案所提到的,您不需要创建单元素列表。添加完整性代码。
public static void main(String[] arg) throws FileNotFoundException
{
Scanner scan = null;
scan = new Scanner(new File("Input.txt"));
int count = 0;
Set<String> set = new LinkedHashSet<String>();
while(scan.hasNext())
{
String word = scan.next().replaceAll("[\\W]", "").toLowerCase();
set.add(word);
count++;
}
scan.close();
// System.out.println(set);
System.out.println();
System.out.println("Input.txt has " + count + " words.");
// How do I print a set by myself?
for (String word : set) {
// Also remove commas
System.out.println(word.replaceAll(",",""));
}
}
答案 1 :(得分:0)
我会这样做:
Set<String> set = new LinkedHashSet<String>();
while(scan.hasNext())
{
String noDuplicate = scan.next().replaceAll("[\\W]", "").toLowerCase();
set.add(noDuplicate);
}
scan.close();
System.out.println("The text has " + set.size() + " unique words.");
您的解决方案(创建一个元素数组,将其转换为List
,并将 转换为HashSet
)除了不正确之外,效率极低。只需使用您最初使用的String
,并将其添加到LinkedHashSet
(这将保留排序)。最后set.size()
会显示句子中唯一单词的数量。