尝试在对象的HashMap内填充并返回List

时间:2013-11-17 07:02:52

标签: java string list hashmap

我需要计算字符串的出现次数和关系。

例如,我应该阅读上面的文件:

(city)  (name)  (surname)
London  Johnny  Stuart
Leeds   Johnny  Bravo
Wigan   Richard Stuart
Bristol Richard Bravo
Bolton  Johnny  Bravo
York    Alex    Crowley
Bolton    null    null

我需要计算与姓氏相关的姓氏,唯一姓名和名单的数量,例如上面的输出(姓氏,姓氏数,唯一姓名,名单):

Stuart  2 2 Johnny, Richard
Bravo   3 2 Johnny, Richard
Crowley 1 1 Alex

我正在尝试实现MutableInt(Most efficient way to increment a Map value in Java)的修改版本但不成功。

代码:

class MutableInt{

    //Surname Count
    int value = 1;
        public void increment () { ++value;      }
        public int  get ()       { return value; }
    //Name List and Count
    List<String> name;
    int nameCount = 1;
        public void incrementName () { ++nameCount;      }
        public int getNameCount() { return nameCount; }         

        public void addName(String n){
            if(n != null && !name.contains(n)){
                name.add(n);
                incrementName();
            }
        }
        public String getName() {
            return Arrays.toString(name.toArray());

        }
        public String toString() {
        return (this.get()+
            "\t"+ this.getNameCount() +
            "\t"+ this.getName());
        }
}

HashMap填充:

    Map<String, MutableInt> nameCount = new HashMap<String, MutableInt>();
    String l;
    while ((l = inputStream.readLine()) != null) {

       if (curLine++ < 1) {
            continue;
        }

        values = l.split("\t");
        String name = values[1];
        String surname = values[2];

        // Count Names
        MutableInt count1 = nameCount.get(surname);
        if (count1 == null) {
            nameCount.put(surname, new MutableInt());
            nameCount.get(surname).addName(name);

        }
        else {
            count1.increment();
            nameCount.get(surname).addName(name);
        }
}

印刷:

Iterator<Entry<String, MutableInt>> itrE1 = nameCount.entrySet().iterator();

    while(itrE1.hasNext()){
        Map.Entry<String, MutableInt> entry1 = itrE1.next();

        efileWriter.write(entry1.getKey()"\t"+ entry1.getValue().toString()+"\n");
   }

这就是我遇到的错误:

java.lang.NullPointerException at diverenrich.InterfaceAgent$writeSummary$MutableInt.addGene(InterfaceAgent.java:626)
        at diverenrich.InterfaceAgent$writeSummary.action(InterfaceAgent.java:744)

Line 626 -> if(na != null && !name.contains(name)){ ... }
Line 744 -> nameCount.get(surname).addName(name);

任何提示?

1 个答案:

答案 0 :(得分:2)

MutableInt中,您没有初始化name,因此它是null - 因此在.contains()对象上调用null时就是NPE。您需要将其初始化为某些内容,例如:

List<String> name = new ArrayList<String>();

另外,另外,您可能需要稍微清理一下设计,或者至少为对象选择更合适的名称,因为MutableInt似乎远远不只是一个可变整数。