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

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

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


有小费吗?

最佳答案

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

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


另外,换句话说,您可能希望稍微简化一下设计,或者至少为对象选择更合适的名称,因为MutableInt看起来远不只是可变的整数。

10-06 07:21