2013-08-15 3 views
-1

мне нужна помощь со следующим вопросом: http://practiceit.cs.washington.edu/problem.jsp?category=Building+Java+Programs%2C+3rd+edition%2FBJP3+Chapter+11&problem=bjp3-11-e19-rarestJava Collections Помощь (Practice-It!)

Вот мой код для этого:

public static int rarest(Map<String, Integer> m) { 
if (m.isEmpty()) { 
    throw new NullPointerException(); 
} 

int min = Integer.MAX_VALUE; 
int store = Integer.MAX_VALUE; 
Map<Integer, Integer> m1 = new TreeMap<Integer, Integer>(); 
List<Integer> l = new ArrayList<Integer>(); 

for (Integer a: m.values()) { 
    l.add(a); 
} 

for(int i=0; i<l.size(); i++) { 
    int temp = 1; 
    for(int j=i+1; j<l.size(); j++) { 
     if (l.get(i) == l.get(j)) { 
      temp++; 
     } 
    } 

    if (!m1.containsKey(l.get(i))) { 
     m1.put(l.get(i), temp); 
    } 
} 

for(Integer a: m1.keySet()) { 
    int val = m1.get(a); 
    if (val == min) { 
     if (a<store) { 
      store = a; 
     } 
    } else if (val < min) { 
     min = val; 
     store = a; 
    } 
} 

return store; 

}

Когда код работает на этом:

{A=1000, B=1, C=101, D=3, J=1000, K=101, L=3, LN=1, M=1000, N=101, R=3, S=1000, T=101, V=3, W=1, X=1, Y=1, Z=1}, 

я получаю возвращение 1000, когда возвращение должно быть 3. Почему это так?

+1

никогда не бросайте исключение NullPointerException ... –

+0

Просто отлаживайте свой код. – erencan

+0

Я бы предложил вам отладить ваш код и добавить контрольные точки в свой код, чтобы проверить значения в ваших переменных. Специально последний цикл. –

ответ

1

Вы должны изменить

l.get(i) == l.get(j) 

в

l.get(i).equals(l.get(j) 
  • Integer является ссылочным типом
  • equals() сравнивает значения
  • == сравнивает указатели
Смежные вопросы