2016-12-06 84 views
0

問題如下:Jane有她與朋友關聯的號碼。我必須輸出從喜歡最少的喜歡到最喜歡的朋友。如何輸出地圖的反轉[Java]

我的主要好奇心是如何在輸出時顛倒地圖值的順序。 在我的代碼中,我必須通過Iterator(我無法直接使用集合)提取值,然後通過在索引0處插入每個連續元素將每個字符串存儲到ArrayList中。因此,這顛倒了順序我想我會工作。

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流和lambda表達式。如果你實際上可以使用喜歡的數字作爲鍵,在我看來[@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的上限和下限),那麼是的,我同意。這個練習的目的只是爲了說明一個比較器可以用來解決OP問題 –

0

請試試這個:

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

這會給你一個有序映射,從喜歡的量最少到最喜歡的。 如果你想要一個有序映射從最喜歡喜歡最少的,你可以這樣做:

TreeMap<Integer, String> m = new TreeMap<Integer,String>(Collections.reverseOrder());