2014-02-07 3 views
0

Я не знаю, как получить значение на карте, которая была наименее.Получите наименьшее значение на карте

проблема:

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

Например, предположим, что карта содержит сопоставления от имен учеников (строки) до их возраста (целые числа). Ваш метод вернет наименее часто встречающийся возраст. Рассмотрим переменную карту м, содержащую следующий пар ключ/значение:

{Алисса = 22, Char = 25, Dan = 25, Джефф = 20, Kasey = 20, Ким = 20, Mogran = 25, Ryan = 25, Stef = 22} Три человека в возрасте 20 лет (Jeff, Kasey, и Kim), два человека: 22 года (Алисса и Стеф), а четыре человека - 25 лет (Char, Dan, Mogran и Ryan). Таким образом, вызов редчайших (м) возвращает 22, потому что только два человека в этом возрасте.

Если есть галстук (два или более редких возраста , которые происходят одинаково), верните самый младший возраст среди . Например, если бы мы добавили еще одну пару Kelly = 22 к карте выше, теперь будет галстук из трех человек в возрасте 20 лет (Jeff, Kasey, Kim) и три человека в возрасте 22 лет (Алисса, Келли, Стеф). Таким образом, вызов , вызывающий самый редкий (m), теперь возвращает 20, потому что 20 меньше из самых редких значений .

сейчас я считаю, что этот код дает мне наименьшее количество int, но как я могу получить это значение?

public static int rarest (Map<String, Integer> map) { 
    List<Integer> list = new ArrayList<Integer>(); 
    for(Integer i: map.values()) { 
        list.add(i); 
    } 
    int min = 0, count = 0; 
    for(Integer i: list) { 
        count = Collections.frequency(list, i); 
     if(count < min) { 
      min = count; 
     } 
    } 
    return min;   
} 

ответ

1

отслеживать значения i, который соответствует наименьшим числом min. Это должно выглядеть знакомо:

public static int rarest (Map<String, Integer> map) { 
    List<Integer> list = new ArrayList<Integer>(); 
    for(Integer i: map.values()) { 
     list.add(i); 
    } 
    int min = Integer.MAX_VALUE, rarestValue = 0; 
    for(Integer i: list) { 
     int count = Collections.frequency(list, i); 
     if(count < min || (count == min && i < rarestValue)) { 
      min = count; 
      rarestValue = i; 
     } 
    } 
    return rarestValue; 
} 
+0

Это также необходимо обработать галстук, и в этом случае вернуть smalle r целое число. – Jason

+0

Я не знаю почему, но он всегда возвращает 0. Когда он должен вернуться 22. – JavaWannabee

+1

Это потому, что в коде есть небольшая ошибка. Я отредактирую его. – Jason

0

сделать это так,

public static int rarest (Map<String, Integer> map) { 

    List<Integer> list = new ArrayList<>(map.values()); 
    Collections.sort(list); // you need to sort the list first 
    int min = list.get(0); // this is your bug, min shouldn't start at 0 
    int count = 0, rarest = 0; 
    for(Integer i: list) { 
     count = Collections.frequency(list, i); 
     if(count < min) { 
      min = count; 
      rarest = i; 
     } 
    } 
    return rarest; 
} 
  1. Ваша ошибка в том, что мин не должен быть инициализирован в 0, но при первом значении списка
  2. Если вы не сортируете список сначала, в случае галстука, вы не обязательно получите младшего
+0

Благодарим за то, что вы указали, что не так в коде. Ваш код выглядит чистым и удобным для чтения. – JavaWannabee

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