0

私は持っていHashMapます。

Map<String,String> lhm = new HashMap<String,String>();
lhm.put("Zara", "biu");
lhm.put("Mahnaz", "nuios");
lhm.put("Ayan", "sdfe");
lhm.put("Daisy", "dfdfh");
lhm.put("Qadir", "qwe");

プロパティファイルで指定されたシーケンスに従ってそのハッシュマップをソートしたい.実際には、そのプロパティエントリにはキーがいくつかの順序で含まれます.私のプロパティエントリは次のようになります

seq=Ayan,Zara,Mahnaz,Qadir,Daisy

私がこれに向かって試したことは

Map<String,String> lhm = new HashMap<String,String>();
Properties prop=new Properties();
prop.load(new FileInputStream("D:\\vignesh\\sample.properties"));
// Put elements to the map
lhm.put("Zara", "biu");
lhm.put("Mahnaz", "nuios");
lhm.put("Ayan", "sdfe");
lhm.put("Daisy", "dfdfh");
lhm.put("Qadir", "qwe");

// Get a set of the entries
Set<Entry<String, String>> set = lhm.entrySet();
// Get an iterator
Iterator<Entry<String, String>> iter = set.iterator();
// Display elements
String sequence=prop.getProperty("seq");
System.out.println("sequence got here is "+sequence);
String[] resultSequence=sequence.split(",");

for(int j=0;j<resultSequence.length;j++)
{
   while(iter.hasNext()) {

     Map.Entry me = (Map.Entry)iter.next();
     String res=(String) me.getKey();

     if(res.equals(resultSequence[j]))
     {
       System.out.println("values according with the sequence is "+lhm.get(resultSequence[j]));
     }   
   }
}

この後に得られる出力は

sequence got here is Ayan,Zara,Mahnaz,Qadir,Daisy
values according with the sequence is sdfe

私の期待される出力は

values according with the sequence is sdfe
values according with the sequence is biu
values according with the sequence is nuios
values according with the sequence is qwe
values according with the sequence is dfdfh

for ループの最初の反復で機能しています。その後、for ループからも終了します。ここで何が欠けていますか??読んでくれてありがとう。

4

9 に答える 9

5

イテレータをリセットしたことがないため、機能していません。最初の実行時にのみ文字列を一致させます。次のように、反復子をループ内に配置して、反復ごとに新しい反復子を取得してみてください。

for(int j=0;j<resultSequence.length;j++)
{
     Iterator<Entry<String, String>> iter = set.iterator();
     while(iter.hasNext()) {
       ....
     }
}
于 2013-09-05T08:16:47.790 に答える
3

あなたはあなたの仕事を複雑にしすぎています。実際、値を並べ替えた順序で出力しているだけで、実際には並べ替えていません。また、それは並べ替えを実装するための哀れな方法です。シーケンス内の文字列と同じ回数だけマップを反復処理しています (現在は5です)。

TreeMapキーを並べ替えたい場合は、代わりにa を使用する必要があります。ここでは、プロパティ ファイルの値に基づいて比較するカスタムComparatorを渡す必要があります。

文字列に順序があるとします:

String order = "Ayan,Zara,Mahnaz,Qadir,Daisy";

次に、コンパレータは次のようになります。

Comparator<String> comparator = new Comparator<String>() {
        @Override
        public int compare(String key1, String key2) {
            return order.indexOf(key1) - order.indexOf(key2);
        }
    };

コンパレータは、オーダー文字列のインデックスに基づいて TreeMap の各キーを比較します。TreeMapこのコンパレータをオーバーロードされたコンストラクタに渡すだけです。

SortedMap<String,String> lhm = new TreeMap<String,String>(comparator);

これで、マップに挿入したものはすべて、プロパティ ファイルで定義された順序に従って並べ替えられます。

マップを反復するには、拡張 for ループを使用できます。

for(Entry<String, String> entry : lhm.entrySet()) {
    System.out.println(entry.getValue());
}
于 2013-09-05T08:20:25.897 に答える
1

iteratorfor ループの反復ごとに取得する必要があります。

...

for(int j=0;j<resultSequence.length;j++)
{
    // Get an iterator
    Iterator<Entry<String, String>> iter = set.iterator();

    while(iter.hasNext()) {

...
于 2013-09-05T08:16:57.727 に答える
0

他の回答がイテレータをリセットしていないエラーを示しているので、あなたが達成しようとしていることを行う別の方法を提案させてください。

リスト全体を調べたい場合は、反復子を使用して通常のwhile(iter.hasNext()){}ループを記述する代わりに、次の例のように for ループを使用することを検討してください。

    Map<String,String> lhm = new HashMap<String,String>();
    // Put elements to the map
    lhm.put("Zara", "biu");
    lhm.put("Mahnaz", "nuios");
    lhm.put("Ayan", "sdfe");
    lhm.put("Daisy", "dfdfh");
    lhm.put("Qadir", "qwe");

    for(Entry<String, String> e : lhm.entrySet()) {
        // do something as the for loop iterates through your map.
        // e being the current element.
    }   
于 2013-09-05T08:27:53.870 に答える
0

HashMap順序を保存しませんLinkedHashMap。値が挿入されたのと同じ順序で反復することを使用する必要があると思います。

于 2013-09-05T08:14:26.210 に答える
0

while ループは 1 回だけ実行されます。これは、反復子が最後の要素に到達した後、それ以上の値を保持しないためです。while イテレータを使用する代わりに

for each loop または、 for ループ内に新しいイテレータを作成して試してください

于 2013-09-05T08:19:04.577 に答える