【问题标题】:Display HashMap of String and ArrayList显示String和ArrayList的HashMap
【发布时间】:2013-08-09 09:37:33
【问题描述】:

我得到了一个 String 和 arraylist 的 hashmap 作为值;当值为:

<StringA: {element1,element2}, StrinbB: {null}>

值的显示(即 ArrayList)总是从空元素开始。所以它看起来像:

{ , 1.element1 2.element2 }

问题:

  1. 为什么第一个元素是空的?
  2. 为什么两个元素之间没有昏迷?

功能:

public String printTableNames(HashMap<String, ArrayList<String>> Map) {

        HashMap<String, ArrayList<String>> map = Map;  
        String s="\n\t\t Tables: ";
        Iterator<Entry<String, ArrayList<String>>> iter = map.entrySet().iterator();

        s= s + " { ";
        while (iter.hasNext()) {
            Entry<String, ArrayList<String>> entry = iter.next();

            List<String> l = new ArrayList<String>();

            l = entry.getValue();
            String temp="";
            for (int i=1; i<=l.size(); i++){

                temp= temp +" "+ Integer.toString(i)+"."+l.get(i-1);
            }               
            s = s + temp;

            if (iter.hasNext()) {
                s=s+",";
            }
            else s=s+" }";
        }
        return s;

    }

【问题讨论】:

    标签: java arraylist hashmap


    【解决方案1】:

    来自@987654321@apidoc:

    这个类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

    这就是为什么不按插入顺序打印值的原因。关于您的代码示例的一些注释,请考虑以下代码:

     Map<String, List<String>> map = new HashMap<String, List<String>>() {{
            put("a", Arrays.asList(new String[]{"1","2"}));
            put("b", Arrays.asList(new String[]{"4","3"}));
     }};
    
     System.out.println(Arrays.deepToString(map.entrySet().toArray()));
    

    它输出:

    [b=[4, 3], a=[1, 2]]
    

    不需要写那么多循环:)(除非你坚持打印每个元素的序数,但在这种情况下也有其他解决方案)

    请注意,我在HashMap 声明中使用了List 接口,它允许我在初始化中使用Arrays.asList 方法。

    在适用的情况下,最好使用接口而不是实现接口的类。它使您的代码更加灵活 - 例如如果出于某种原因你想用LinkedList 替换你的ArrayList,你只需要在初始化语句中替换而不是在你的代码中。

    相关方法apidoc链接:

    【讨论】:

      【解决方案2】:

      它正在打印出你要求它做的事情。

      一个关键点 - HashMap 在理论上被定义为没有设置顺序 - 您期望您的结果按照您插入的顺序打印出来,Java 实际上是以相反的顺序遍历它们。因此,您的打印输出显示“null”(未打印,以空字符串形式给出),然后是逗号,然后是下一个元素。

      您的数组元素之间没有逗号,因为您没有在代码中放置逗号,而是在 HashMap 条目之间为逗号编码。为此更改此行:

      temp= temp +" "+ Integer.toString(i)+"."+l.get(i-1);
      if (i !=l.size()) temp += ',';
      

      【讨论】:

        【解决方案3】:

        Output = { , 1.element1 2.element2 } 告诉你:

        • 一个列表 = 空 (它必须为空且不为空,否则您将获得 NPE)
        • 其他列表 = 1.element1, 2.element2

        对于HashMap,键的迭代顺序与插入的顺序不同。

        在您的情况下,首先迭代空列表,然后是第二个列表。

        如果您想按插入顺序进行迭代,请查看LinkedHashMap

        至于元素之间的逗号:

           temp= temp +" "+ Integer.toString(i)+"."+l.get(i-1) + ",";
        

        应该这样做。如果您不希望您的列表打印为 ele1,ele2,

        【讨论】:

          【解决方案4】:

          空白是由于您使用的错误构造的模式造成的。你从额外的空间" { "开始,在第一次运行中你跳过for,然后你的versifier有下一个项目并附加","。所以你有了 ” { ,”。在下一次运行中,您进入循环并添加空间索引和值。

          请注意,String 类型用于存储不修改的文字。请改用 StringBuilder。我允许自己快速重写您的代码,并添加了针对 NullPointer 的修复和避免为空的逻辑。

          public String printTableNames(Map<String, List<String>> map) {
          
              StringBuilder builder = new StringBuilder("\n\t\t Tables:");
          
              builder.append(" { "); 
          
              for(Iterator<Entry<String, List<String>>> mapIterator = map.entrySet().iterator(); mapIterator.hasNext();) {
          
                  List<String> values = mapIterator.next().getValue();
          
                  if(values != null && !values.isEmpty()) { //We do not operate on null and empty list 
                      int i=0; //As we have if block we enclose this so we do not need expensive values.get(i-1) to fetch value. 
                      for(String value : values) {
                          builder.append(' ');
                          builder.append(i++);
                          builder.append(value);
                      }
          
                  } else { 
                      continue; //We skip the empty comma 
                  }
          
                  if(mapIterator.hasNext()) {
                      builder.append(',');
                  } 
          
              }
          
              builder.append(" }");
          
              return builder.toString();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-29
            • 1970-01-01
            • 2018-08-06
            • 2016-11-04
            相关资源
            最近更新 更多