2016-01-16 3 views
0

У меня есть карта, которую я упрощая, но в Ессенции содержит ключевые значения некоторых данных, таких как:Список номеров с карты

Yahya, 4 
John, 4 
Blake, 2 
Jill 2 
Janoe, 6 
Jilly 12 
Zapon, 5 
Zoe, 4 
Hamed, 1 

мне нужно заказать, так что я получаю следующий вывод:

1. Jilly, 12 pts 
2. Janoe, 6 pts 
3. Zapon, 5 pts 
4. John, 4 pts 
4. Yahya, 4 pts 
4. Zoe, 4 pts 
7. Blake, 2 pts 
7. Jill, 2 pts 
9. Hamed, 1 pts 

Я уже использовал компаратор на заказ значения Карта в соответствии со значением:

public <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
    Comparator<K> valueComparator = new Comparator<K>() { 
     public int compare(K k1, K k2) { 
      int compare = map.get(k2).compareTo(map.get(k1)); 
      if (compare == 0) return 1; 
      else return compare; 
     } 
    }; 
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
    sortedByValues.putAll(map); 
    return sortedByValues; 
} 

и читать: How to get element position from Java Map, Order HashMap alphabetically by value и многое другое, но не уверены, как это сделать.

Я знаю, что вы можете использовать это, чтобы получить ключевые значения:

for (Map.Entry<String, Integer> entry : map.entrySet()){ 
    System.out.println(entry.getKey() + " ," + entry.getValue() + " pts"); 
} 

Однако две функциональные пропавшие:

  1. Сортировка по алфавиту, когда ключи одинаковы
  2. держать ту же нумерацию, когда значение то же самое и перейти к правильному счету позже.

Пробовал это:

Map<String, Integer> map = sortByValues(groupList); 
      int count = 1; 
      int counter = 1; 
      int previousScore = 0; 

      for (Map.Entry<String, Integer> entry : map.entrySet()) { 

       //counter = count; 
       if (previousScore == entry.getValue()) { 

        System.out.println(counter - 1 + " " + entry.getKey() + "," + entry.getValue() + " pts"); 

       } else { 

        System.out.println(counter + " " + entry.getKey() + "," + entry.getValue() + " pts"); 
        previousScore = entry.getValue(); 
        count++; 
       } 
       counter++; 

      } 

Любые мысли приветствуются и приветствуются. Может ли кто-нибудь предложить метод для достижения требуемого результата?

ответ

0
  1. В вашем ValueComparator заменить if (compare == 0) return 1; с if(compare == 0) return k1.compareTo(k2).
  2. При создании нумерации (вы не указали какой-либо код для этого), держите два счета. Увеличьте одну из них на каждой итерации и назначьте ее другой, но только если текущее значение отличается от последнего. Используйте последнюю для генерации «нумерации».
+0

Спасибо за ответ, но ... k1.compareTo (к2) удаляет повторяющиеся значения вместо нумерации и пробовал разные счета до и, следовательно, задавал вопрос, поскольку я не мог понять это правильно. Имел ту же идею, но не знал, как ее реализовать. –

+0

Объявите 'K' как' Comparable', так же, как и с 'V'. Или, еще лучше, избавьтесь от родового и просто используйте «Map », так как это то, что вам действительно нужно. Покажите свой код для подсчетов, если вы хотите, чтобы мы помогли вам понять, что с ним не так. – Dima

0

Это то, что я закончил с, чтобы заставить его работать, чтобы иметь правильный счетчик:

Map <String, Integer>map = sortByValues(leagueTable); 

      int counter = 1; 
      int previousScore = 0; 
      int relativeCount = 0; 
      int n= 0; 
      for (Map.Entry<String, Integer> entry : map.entrySet()) 
      { 

       int value = entry.getValue(); 


       if(previousScore == entry.getValue()){ 

        if(n == 0){ 

         relativeCount = counter-1; 

        n++; 
        } 
       System.out.println(relativeCount + " " + entry.getKey() + "," + entry.getValue() + " pts"); 

       } 
       else{ 
       n=0; 
       System.out.println(counter + " " + entry.getKey() + "," + entry.getValue() + " pts"); 
       previousScore = entry.getValue(); 

       } 
       counter++; 

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