while循环里面for循环不起作用

时间:2013-09-05 08:07:40

标签: java hashmap

我有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");

我想根据属性文件中给出的顺序对该hashmap进行排序。实际上,该属性条目将按某种顺序具有键。我的属性条目将如下所示

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循环退出。我在这里缺少什么?感谢阅读。

9 个答案:

答案 0 :(得分:5)

它不起作用,因为你永远不会重置你的迭代器。您只匹配第一次运行时的字符串。尝试将迭代器放在循环中,为每次迭代获取一个新的迭代器,如下所示:

for(int j=0;j<resultSequence.length;j++)
{
     Iterator<Entry<String, String>> iter = set.iterator();
     while(iter.hasNext()) {
       ....
     }
}

答案 1 :(得分:3)

你的任务太复杂了。实际上,您只是按排序顺序打印您的值,而不是实际排序它们。而且,这是实现排序的可悲方式。您正在迭代地图的次数与序列中的字符串一样多(目前它是5)。

如果要对键进行排序,则应使用TreeMap。在这里,您需要传递自定义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 constructor

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

现在,无论您在地图中插入什么,都将根据属性文件中定义的顺序进行排序。

要迭代地图,您可以使用增强型for循环:

for(Entry<String, String> entry : lhm.entrySet()) {
    System.out.println(entry.getValue());
}

答案 2 :(得分:1)

对于for循环的每次迭代,你应该获得iterator

...

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

    while(iter.hasNext()) {

...

答案 3 :(得分:1)

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

答案 4 :(得分:0)

HashMap不会保存任何订单,我认为您应该使用LinkedHashMap,其迭代次数与插入的值相同。

答案 5 :(得分:0)

我认为你不需要使用while循环进行迭代,一旦你从属性文件中获得带有键的有序数组就足够了:

for (String key:resultSequence) {
    String value = lhm.get(key);
    System.out.println("values according with the sequence is "+ value); 
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分: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.
    }