删除重复的数组条目
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<String> fracsDisplay = new ArrayList<String>();
代替:
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);
【讨论】:
以上是关于删除重复的数组条目的主要内容,如果未能解决你的问题,请参考以下文章