我正在编写一个方法,允许我计算String类型的元素在Strings类型的LinkedList中出现的次数。我的代码如下所示不起作用。我继续在下面评论的行中获得索引超出界限。似乎无法找到错误
public int findDuplicate (LinkedList<String> e) {
int j = 1;
LinkedList<String> test = e;
while (!test.isEmpty()){
test = e;
String value = test.pop();
//Screws up here when i = 6
for(int i =0; i<=test.size() && test.get(i)!=null; i++){
String value3 = test.get(i);
if(e.get(i).equals(value) && i<=test.size()){
String value2 = test.get(i);
j++;
String Duplicate = e.get(i);
e.remove(i);
}
}
System.out.println(value + " is listed " + j + " times");
}
return j;
}
使用hashmaps ..仍然无法正常工作
public void findDuplicate (LinkedList e) {
Map<String,Integer> counts = new HashMap<String,Integer>();
while(!e.isEmpty()){
String value = e.pop();
for(int i =0; i<e.size(); i++){
counts.put(value, i);
}
}
System.out.println(counts.toString());
}
我的代码应该通过链接列表找出列表中元素出现的次数,并同时从列表中删除重复项。然后打印元素及其在列表中出现的次数。我昨晚发布了这个帖子,但还没有得到答复。对不起,重新发布。
答案 0 :(得分:6)
您正在离开列表的末尾。变化
for(int i =0; i<=test.size() && test.get(i)!=null; i++){
到
for(int i =0; i< test.size() && test.get(i)!=null; i++){
List
(或数组)的有效索引为0
到size() - 1
。
答案 1 :(得分:2)
关于计算重复项的hashmap示例:
@Test
public void countOccurrences() {
LinkedList<String> strings = new LinkedList<String>(){{
add("Fred");
add("Fred");
add("Joe");
add("Mary");
add("Mary");
add("Mary");
}};
Map<String,Integer> count = count(strings,new HashMap<String,Integer>());
System.out.println("count = " + count);
}
private Map<String, Integer> count(List<String> strings, Map<String, Integer> runningCount) {
if(strings.isEmpty()) {
return runningCount;
}
String current = strings.get(0);
int startingSize = strings.size();
while(strings.contains(current)) {
strings.remove(current);
}
runningCount.put(current, startingSize - strings.size());
return count(strings,runningCount);
}
如果您希望保留原始字符串列表,则可以执行
Map<String,Integer> count = count(new LinkedList<String>(strings),new HashMap<String,Integer>());
System.out.println("strings = " + strings);
System.out.println("count = " + count);
答案 2 :(得分:2)
查看谷歌的番石榴收藏品,它有一个完美的类来维护地图并计算:
https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap
Multiset<String> wordsMultiset = HashMultiset.create();
wordsMultiset.addAll(words);
// now we can use wordsMultiset.count(String) to find the count of a word
答案 3 :(得分:1)
这不会影响您的越界问题,但您仍在评估列表中的元素。如果删除元素,则应在之后调用i--
,或者跳过下一个实体(重新编制索引)以进行评估。
还有关于您的代码的注意事项,我看到您正在尝试复制列表,但标准分配意味着test
和e
都指向同一个实例。您需要使用Collections.copy()
,请参阅this SO thread on how to use the class。
答案 4 :(得分:1)
我希望你意识到test = e
声明在做什么。在此语句执行后,test
和e
都会引用相同的对象。
如果他们中的任何人修改了列表,则另一个人看到它,因为他们都在查看同一个对象。
如果不是这样,则需要克隆列表,然后再将其分配给另一个列表引用。