删除重复的数组条目

Posted

技术标签:

【中文标题】删除重复的数组条目【英文标题】:Deleting Duplicate Array Entries 【发布时间】:2014-01-12 02:17:11 【问题描述】:

我正在尝试使用扫描仪读取具有“a/b”形式的分数字符串的文本文件,将它们存储在一个数组中,然后将每个唯一的字符串及其计数打印到控制台。我可以用准确的计数打印文本文件中的每个单独条目,但我不知道如何打印没有任何重复的数组内容。

我也在尝试完全在 main 中完成此任务。到目前为止,这是我所得到的:

public static void main(String[] args) throws FileNotFoundException


        ArrayList<String> fracs = new ArrayList<String>();
        Scanner input = new Scanner(new File("input.txt"));
        ArrayList<String> fracsDisplay = new ArrayList<String>();

        while(input.hasNext())
            fracs.add(input.next());

        for(int i = 0; i < fracs.size(); i++)
        
            int count = 0;
            for(int j = 0; j < fracs.size(); j++)
            
                if(fracs.get(i).equals(fracs.get(j)))
                    count++;
            
            System.out.println(fracs.get(i) + ": " + count);
        

        input.close();

【问题讨论】:

hmm,你可以在添加元素之前检查 fracs.contains(...) 是否数组已经包含一个元素,如果是这样,只需增加计数器或避免再次添加元素。 Set 默认情况下防止重复条目。如果要打印条目名称及其计数,为什么不使用Map?通过唯一条目 (=key) 查找计数 (=value) 【参考方案1】:

消除重复项的最简单方法是使用Set,因为您存储的字符串不会添加重复项。

您可以使用 ArrayList&lt;String&gt; fracsDisplay = new ArrayList&lt;String&gt;(); 代替:

Set<String> fracsDisplay = new HashSet<>();
fracsDisplay.addAll(fracs);
for (String s : fracsDisplay) 
    System.out.println(s);

如果需要维护某种顺序,那么我建议使用TreeSet,但两者都可以处理重复项的删除...在这种情况下,这似乎是您想要的。

【讨论】:

如果条目应该在有序结构中可用的缺点 没错,在这种情况下可以使用TreeSet,OP 没有说明顺序是否重要...更新答案以反映您的建议!【参考方案2】:

如果掌握它,这个任务就是类似“字数统计”的任务。做这样的任务,HashMap 是最好的选择。 我建议你使用 HashMap 来完成这项任务。您的算法具有 O(n^2) 时间复杂度。您可以使用 HashMap 将其减少到 O(n)。使用 HashMap 还可以帮助您进行重复数据删除。试试看。

        HashMap<String, Integer> fracs = new HashMap<String, Integer>();
        Scanner input = new Scanner(new File("input.txt"));

        while(input.hasNext()) 
            String frac = input.next();
            if (! fracs.containsKey(frac)) 
                fracs.put(frac, 1);
             else 
                fracs.put(frac, fracs.get(frac) + 1);
            
        

        input.close();

        for (Map.Entry<String, Integer> fracCount : fracs.entrySet()) 
            System.out.println(fracCount.getKey() + " " + fracCount.getValue());
        

如果分数字符串应该保持出现的顺序,使用LinkedHashMap;如果fraction String 应该保持字典顺序或某些特定顺序,请使用SortedHashMap。在这里,我建议您阅读“Java 泛型和集合”,它侧重于 Java 集合框架

【讨论】:

【参考方案3】:

您应该将所有内容存储到 ArrayList 中吗?您可以使用HashSet 或TreeSet,因为不允许重复。

【讨论】:

【参考方案4】:

您可以使用HashSet,因为Set 集合不允许重复值。如果您的数组顺序很重要,那么您可以使用LinkedHashSet

Set<T> set = new HashSet<T>();
Collections.addAll(set, array);

【讨论】:

以上是关于删除重复的数组条目的主要内容,如果未能解决你的问题,请参考以下文章

合并两个数组并删除php中的重复条目

如何从二维数组中删除重复项? [关闭]

如何合并子数组值并删除重复项?

用于对数组进行重复数据删除的 Java 程序

从Mongoose的数组中删除一个对象[重复]

没有重复的排列算法?