试图删除重复的元素

时间:2014-04-13 23:19:33

标签: java set hashset duplicate-removal

我一直在努力学习使用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.");

    }
}

2 个答案:

答案 0 :(得分:0)

您的问题是,每次使用扫描仪读取单词时都会创建new HashSet,因此没有机会进行重复数据删除。您可以使用以下步骤进行修复。此外,正常HashSet不会保留排序。

  1. 在扫描程序循环之前创建一次HashSet。
  2. 使用LinkedHashSet,以便按照添加顺序的顺序保留订单。
  3. 在循环内部,使用set.add(item);。正如另一个答案所提到的,您不需要创建单元素列表。
  4. 添加完整性代码。

    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()会显示句子中唯一单词的数量。