迭代Map条目时如何避免DuplicateFormatFlagsException

时间:2014-07-23 21:19:44

标签: java map enums iterator set

给出一张地图<字符串,枚举>,如何使用Map的keySet()并显示值来迭代条目?我只熟悉Map迭代的四种方法;我可以得到三个工作,我不确定为什么剩下的一个抛出异常。

我尝试过实现自定义的Gender.toString()方法,重新输入Set<> &安培;映射值,并将Gender值内联转换为String。

希望我只是遗漏了一些显而易见的东西,但是半小时的搜索让我没有答案。可能我的问题写错了。希望这段代码可以更好地描述我的问题。

public enum Gender { MALE, FEMALE; }

public static void main (String[] args)
{
    Map<String,Gender> humans = new HashMap<String,Gender>();

    humans.put("Samuel", Gender.MALE);
    humans.put("Bryce", Gender.MALE);
    humans.put("Conrad", Gender.MALE);
    humans.put("Angie", Gender.FEMALE);

    System.out.println("for .keyset()");
    Set<String> ks = humans.keySet();
    for (String key : ks)
    {
        System.out.printf("Key: %s  Value: %s\n", key, humans.get(key));
    }

    System.out.println("\nfor .entrySet() ");
    Set<Map.Entry<String,Gender>> entrySet = humans.entrySet();
    for (Map.Entry entry : entrySet)
    {
        System.out.printf("Key: %s  Value: %s\n", entry.getKey(), entry.getValue());
    }

    // ***---> FAILS with DuplicateFormatFlagsException
    System.out.println("\nwhile .keyset().iterator()");
    Set<String> ks2 = humans.keySet();
    Iterator<String> keySetIterator = ks2.iterator();
    while (keySetIterator.hasNext())
    {
        String key= keySetIterator.next();
        System.out.printf("Key: %  Value: %s\n", key, humans.get(key) ); // fault line
    }

    System.out.println("\nwhile .entrySet().iterator()");
    Set<Map.Entry<String,Gender>> entrySet2 = humans.entrySet();
    Iterator<Map.Entry<String,Gender>> entrySetIterator = entrySet2.iterator();
    while (entrySetIterator.hasNext())
    {
        Map.Entry<String,Gender> entry = entrySetIterator.next();
        System.out.printf("Key: %s  Value: %s\n", entry.getKey(), entry.getValue() );
    }
}

任何输入都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

Derp's on me ...在发布我的问题后,我注意到了错字。我在%。

之后忘记了转换器
System.out.printf("Key: %  Value: %s\n", key, humans.get(key) ); // fault line

应该是

System.out.printf("Key: %s  Value: %s\n", key, humans.get(key) ); // fault line