2016-12-06 10 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

私は2人の人が同じ量の好きになるということを忘れてしまった。いずれにせよ、あなたのコードは非常に簡潔です。私は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'は悪いComparatorです。オーバーフローエラーが発生する可能性があります。 'Integer.compare(key2、key1) 'を使用してください。 – AJNeufeld

+0

私は'オーバー 'はオーバーフローを指していると仮定していますか?信じられないほど大きな数字(intの上限と下限のように)を扱っているなら、はい、私は同意します。この演習の目的は、コンパレータを使用してOPを解くことができることを示すことに過ぎませんでした –

0

これを試してください:

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

これは最も好きなのが好きなの最小量から、あなたにソートマップを提供します。 したい場合は、ほとんどのソートマップは、あなたがこれを行うことができます同類の最低額に好き:はい

TreeMap<Integer, String> m = new TreeMap<Integer,String>(Collections.reverseOrder()); 
関連する問題