我正在尝试使用扫描仪读取文本文件,其中包含“a / b”形式的分数字符串,将它们存储在一个数组中,然后将每个唯一的字符串及其计数打印到控制台。我可以使用准确的计数打印文本文件中的每个单独条目,但我无法弄清楚如何打印数组的内容而没有任何重复。
我也试图在主要内部完成这一点。这是我到目前为止所得到的:
public static void main(String [] args)抛出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();
}
答案 0 :(得分: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
,但要么会处理重复的删除...在这种情况下,这似乎就是你想要的。
答案 1 :(得分:0)
如果掌握它,此任务是“字数统计”类似的任务。要做这样的任务,HashMap是最好的选择。 我建议你使用 HashMap 来完成这项任务。您的算法具有O(n ^ 2)时间复杂度。您可以使用HashMap将其减少到O(n)。使用HashMap还可以帮助您进行重复数据删除。 Hava一试。
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 ;如果分数字符串应保持字典顺序或某些特定顺序,请使用 SortedHashMap 。在这里,我建议您阅读“ Java Generics and Collections ”,重点关注 Java Collection framework 。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用HashSet
,因为Set
集合不允许重复值。如果您的数组顺序很重要,那么您可以使用LinkedHashSet
。
Set<T> set = new HashSet<T>();
Collections.addAll(set, array);