2016-12-06 2 views
0

Проблема заключается в следующем: у Джейн есть друзья, с которыми она связывает номер. Я должен выводить друзей из наименьшего количества понравившихся симпатий.Как вывести обратную сторону карты [Java]

Мое основное любопытство заключается в том, как изменить порядок значений карты при выводе. В моем коде мне пришлось извлечь значения через Iterator (мне не удалось напрямую использовать коллекцию), а затем сохранить каждую строку в ArrayList, вставив каждый следующий элемент в индекс 0. Это, в результате, отменило порядок, который работал, я полагаю.

import java.util.*; 
import java.io.*; 
import static java.lang.System.*; 

public class Friends { 
    public static void main(String args[]) throws IOException 
    { 
     Scanner line = new Scanner(new File("friends.dat")); 
     int trials = line.nextInt(); 
     for(int k = 0 ; k < trials ; k++) 
     { 
      TreeMap<Integer, String> m = new TreeMap<Integer,String>(); 
      int subtrials = line.nextInt(); 

      for(int a = 0; a < subtrials ; a++) 
      { 
       String name = line.next(); 
       int likes = line.nextInt(); 
       m.put(likes,name); 
      } 

      Iterator iter = m.values().iterator();  //**Code of interest starts here** 
      ArrayList<String> list = new ArrayList<String>(); 

      while(iter.hasNext()) { 

       list.add(0, (String)iter.next()); 
      } 

      for(int a = 0 ; a < list.size() ; a++) 
      { 
       if(a == list.size() - 1) 
        out.print(list.get(a)); 
       else 
        out.print(list.get(a) + ", "); 
      } 
      out.println(); 
     } 
    } 
} 

ответ

-1

Вы можете просто reverse ваш список.

list.reverse(); 

В качестве альтернативы, вы можете использовать TreeMap constructor с обратным компаратором, чтобы сохранить карту в порядке убывания.

... = new TreeMap<>(Collections.reverseOrder(Integer::compare)); 
+0

Да, но это так же, как эквивалент, как добавление каждого элемента с индексом ноль. Я надеялся на что-то, что непосредственно из объекта Map для вывода. –

+0

.reverse() намного эффективнее, чем вставка каждого элемента в положение 0, последовательно. – AJNeufeld

1

Использование количества симпатий как ключа кажется странным, так как у нескольких друзей может быть одинаковое количество понравившихся.

В Java 8, я хотел бы сделать следующее:

Map<String, Integer> map = new HashMap<>(); 
map.put("Jack", 7); 
map.put("Jill", 3); 
map.put("John", 12); 

map.entrySet() 
    .stream() 
    .sorted(Map.Entry.comparingByValue((a, b) -> b.compareTo(a))) 
    .forEach(System.out::println); 

По сути, это превращает запись карты в поток, сравнивает их значение с помощью компаратора, который меняет естественный порядок, а затем распечатывает каждая запись.

Каких результатов в:

John=12 
Jack=7 
Jill=3 
+0

Я забыл упоминание о том, что у двух человек не будет одинакового количества симпатий. В любом случае, ваш код очень ... очень краткий. Я не знаком с Java 8. Не могли бы вы объяснить последние 4 строки? –

+1

@IanLimarta добавил некоторые основные объяснения к моему ответу. Для чего бы то ни было, я предлагаю вам начать чтение в потоках Java и lambdas. Если вы действительно можете использовать количество понравившихся в качестве ключей, [решение, предоставленное @RiaanNel] (http://stackoverflow.com/a/40988439/3558960), лучше, на мой взгляд. –

2

Вы можете использовать пользовательские comparator, чтобы изменить порядок записей в карте (обратите внимание, что это относится только к TreeMap - другие реализации карты не заботятся о заказе).

public static void main(String[] args) { 
    TreeMap<Integer, String> map = new TreeMap<>((key1, key2) -> Integer.compare(key2, key1)); //Custom comparator. 
    map.put(1, "Bob"); 
    map.put(3, "Baz"); 
    map.put(2, "Foo"); 

    System.out.println(map); 
} 
+0

'key2 - key1' - плохой компаратор; он может страдать от ошибок переполнения. Используйте 'Integer.compare (key2, key1)' – AJNeufeld

+0

Я предполагаю, что «Over» относится к переполнению? Если мы имеем дело с невероятно большими числами (как в верхней и нижней границах int), то да, я согласен. Цель этого упражнения состояла в том, чтобы проиллюстрировать, что Компаратор может использоваться для решения ОП –

0

Пожалуйста, попробуйте следующее:

m.forEach((a,b)->System.out.print(b+", ")); 

Это даст вам отсортированный карту, с наименьшим количеством любит наиболее любит. Если вы хотите отсортированный карту из наиболее любит наименьшее количество подобных, вы можете сделать это:

TreeMap<Integer, String> m = new TreeMap<Integer,String>(Collections.reverseOrder()); 
Смежные вопросы