下面的代码打印文件中的所有单词(将其放在第一个数组中)和旁边的第一个单词(第二个数组)。如果有一个单词的副本,它会找到数组中的单词(第一个单词),并向数字数组添加1,但它仍会打印出数组中的副本。我只希望单词的第一个实例旁边有正确的数字来表示数组中有多少次。我的问题确实是我不希望重复打印出来。 (没有arraylists plz)。
while ((in.hasNext())) {
l = in.next() ;
for(int i = 0; i< Wrd.length-1;i++){
if (l.equals(Wrd[i])){
num[i] = num[i] +1;
}
}
Wrd[n]=l;
num[n] = num;
n++;
}
答案 0 :(得分:1)
听起来你无法使用Set
或Map
等 - 如果可以,那么这里的其他建议更容易实现我建议的内容:-)
如果由于某种原因你不能,那么这个怎么样:
// capture all the words first into an array
// the array below is for test purposes
String[] words = {"1", "2", "3", "5", "1", "1", "3", "4", "1", "5", "7", "0"};
Arrays.sort(words); // sort the array - this is vital or the rest wont work
String last = words[0];
int count = 0;
for (String word : words) {
if (word.equals(last)) {
count++;
} else {
System.out.println(last + "=>" + count);
count = 1;
last = word;
}
}
System.out.println(last + "=>" + count);
输出结果为:
0=>1
1=>4
2=>1
3=>2
4=>1
5=>2
7=>1
答案 1 :(得分:0)
您需要使用地图 - 这会自动处理维护唯一的单词列表。如果您覆盖put
方法进行聚合而不是覆盖,则会自动累计计数。
private void readWords(final Iterator<String> in) {
final Map<String, Integer> wordMap = new HashMap<String, Integer>() {
@Override
public Integer put(String key, Integer value) {
final Integer origValue = get(key);
if (origValue == null) {
return super.put(key, value);
} else {
return super.put(key, origValue + value);
}
}
};
while (in.hasNext()) {
wordMap.put(in.next(), 1);
}
//just for display - not necessary
for (final Entry<String, Integer> entry : wordMap.entrySet()) {
System.out.println("Word '" + entry.getKey() + "' appears " + entry.getValue() + " times.");
}
}
测试:
List<String> strings = new LinkedList<String>();
strings.add("one");
strings.add("two");
strings.add("two");
strings.add("three");
strings.add("three");
strings.add("three");
readWords(strings.iterator());
输出:
Word 'two' appears 2 times.
Word 'one' appears 1 times.
Word 'three' appears 3 times.
您可以使用TreeMap
而不是HashMap
按字母顺序对单词进行排序 - 这可能看起来更适合显示;取决于您打算如何处理地图。
答案 2 :(得分:0)
使用布尔标志跟踪给定单词是否重复,如果是,则不将其添加到数组中:
while (in.hasNext()) {
boolean dup = false;
l = in.next() ;
for(int i = 0; i< Wrd.length-1;i++){
if (l.equals(Wrd[i])){
num[i] = num[i] +1;
dup = true;
break; // No reason to check the rest of the array
}
}
if (!dup) {
Wrd[n] = l;
num[n] = num; // If you're looking for frequency, you probably want 1 not num
n++; // only increment the index if we add a new word
}
}