我需要计算字符串的出现次数和关系。
例如,我应该阅读上面的文件:
(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
看起来远不只是可变的整数。