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 回答
1

使用TreeMap。这允许您编写自定义比较器来对条目进行排序。

于 2013-09-05T08:17:23.430 回答
0

HashMap不保存任何顺序,我认为您应该LinkedHashMap以与插入值相同的顺序使用该迭代。

于 2013-09-05T08:14:26.210 回答
0

我认为您不需要使用 while 循环进行迭代,一旦您从属性文件中获取带有键的有序数组就足以做到这一点:

for (String key:resultSequence) {
    String value = lhm.get(key);
    System.out.println("values according with the sequence is "+ value); 
}
于 2013-09-05T08:17:51.153 回答
0

遍历属性文件的键。对于它们中的每一个,获取地图中的元素(如果存在)。

于 2013-09-05T08:17:59.260 回答
0

您的 while 循环只执行一次,因为迭代器在到达最后一个元素后不再保存任何值。而不是 while 迭代器使用

对于每个循环或者在 for 循环中创建一个新的迭代器并尝试

于 2013-09-05T08:19:04.577 回答
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 回答