1

我正在编写一种方法,该方法允许我计算 String 类型的元素在 Strings 类型的 LinkedList 中出现的次数。我下面显示的代码不起作用。我在下面评论的那一行中不断出现索引超出范围。好像找不到bug

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());
}
4

2 回答 2

5

从您的使用方式可以清楚地看出teste您希望它们是两个独立的对象。事实上,他们不是。当您执行以下任务时:

    test = e;

两者都test指向e同一个列表。当你改变一个时,它们都会改变。

至于解决问题的好方法,您可能希望使用 aMap<String,Integer>来计算每个唯一字符串在列表中出现的次数。然后,您可以只遍历列表一次,填充地图。最后,地图将给出最终计数。

于 2013-03-04T07:34:27.507 回答
2

索引从 0 到test.size()-1. 尝试使用:

for(int i =0; i<test.size() && test.get(i)!=null; i++){ 
...

而且,正如@NPE 指出的那样,这段代码不会正常工作,因为etest共享同一个对象。

于 2013-03-04T07:34:37.170 回答