2013-11-17 2 views
2

Мне нужно подсчитать вхождения и отношения строк.Попытка заполнить и вернуть список внутри 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); 

Любые советы?

+0

Правильное значение nameCount равно нулю, а не одному! – Jwojwo

ответ

2

В вашей MutableInt вы не инициализируется name, поэтому null - отсюда NPE при вызове .contains() на null объекта. Вы должны инициализировать его к чему-то, например:

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

Кроме того, на другой ноте, вы можете очистить ваш дизайн немного, или по крайней мере выбрать более подходящие имена для объектов, так как ваш MutableInt оказывается намного больше, чем просто изменяемое целое число.

Смежные вопросы