【问题标题】:How to iterate through a hashmap to get every fourth key, value pair?如何遍历哈希图以获取每四个键值对?
【发布时间】:2019-04-08 09:40:18
【问题描述】:

我有一个这样的哈希图;

key value1
key value2
key value3
key value4
key1 value5
key1 value6
key1 value7
key1 value8
key2 value9
... and so on

现在我想把它放在一个包含 四行 的 ListView 中,在 row1 中,我想要:

key value1
key1 value5
key2 value9
key3 value13 and so on till end

在第 2 行,我想要:

key value2
key1 value6
key2 value10
key3 value14 and so on till end

然后第 3 行和第 4 行也一样。总是只有 4 行。

我在迭代这个时遇到了麻烦。这是我写的代码,但它不起作用。

String[] fourrows = hashMap.get("KEY");
for (int i=0;i<fourrows.length;i++) {
HashMap<String, String> listHashMap = new HashMap<>();
listHashMap.put("TA",  "ROW VALUE "+fourrows[i]);

for (int j=1;j<hashMap.entrySet().size();j+=4) {
String val = hashMap.values().toArray()[j].toString();
String key = hashMap.get(hashMap.keySet().toArray()[0]).toString();

listHashMap.put("IA", key);
listHashMap.put("XA", val);
incmStmtList.add(listHashMap);
}
}

//Then I pass TA, IA and XA to a simple list adapter and add it to a listView.
incmAdapter = new SimpleAdapter(getContext(), incmStmtList,R.layout.content_results, new String[]{"TA", "IA", "XA"},new int[]{R.id.ta, R.id.ia, R.id.tota});
listView.setVerticalScrollBarEnabled(true);
listView.setAdapter(incmAdapter);

谢谢。

【问题讨论】:

  • 没有查看您的代码,但请注意,HashMap 不会保持其插入顺序。您可能想要使用 LinkedHashMap。
  • Map 本身并非设计为具有 index。您不应该期望地图按某种顺序保存项目。
  • ListView 的相关性如何?
  • @BorisvanKatwijk ListView 包含四行 - 每一行在地图中都有一个特定键的特定值...每一行内是一对文本视图,并且应该向每个视图添加多个 IA 和 XA 值.希望澄清。真正的问题是如何做到这一点。
  • @BorisvanKatwijk 我已经编辑了如何将值传递给我的 listView 的问题。谢谢。

标签: java android loops listview hashmap


【解决方案1】:

不要使用HashMap,而是使用Multimap。并根据 key 获取 Collection 对象中的值。然后从每个集合中在所有列表中添加一个值。

Multimap myList = ArrayListMultimap.create();

            myList.put("key","value1");
            myList.put("key","value2");
            myList.put("key","value3");
            myList.put("key","value4");
            myList.put("key1","value5");
            myList.put("key1","value6");
            myList.put("key1","value7");
            myList.put("key1","value8");
            myList.put("key2","value9");
            myList.put("key2","value10");
            myList.put("key2","value11");
            myList.put("key2","value12");
            myList.put("key3","value13");
            myList.put("key3","value14");
            myList.put("key3","value15");
            myList.put("key3","value16");

然后从列表中获取所有键

  Set myKeySet = myList.keySet();
  Object[] keys = myKeySet.toArray();

现在您已经设置了所有密钥。那么

    HashMap<String, String> listHashMap1 = new HashMap<>();
    HashMap<String, String> listHashMap2 = new HashMap<>();
    HashMap<String, String> listHashMap3 = new HashMap<>();
    HashMap<String, String> listHashMap4 = new HashMap<>();

现在将值添加到每个列表中

  for(int i=0;i<4;i++){
        List<String> keyval = (List)myList.get((String)keys[i]);
        listHashMap1.put((String)keys[i],keyval.get(0));
        listHashMap2.put((String)keys[i],keyval.get(1));
        listHashMap3.put((String)keys[i],keyval.get(2));
        listHashMap4.put((String)keys[i],keyval.get(3));
     }

现在您已经设置了四行列表。这个 Multimap 使用的是 google guava。 所以你需要在你的gradle中实现guava,如下所示: 实现 'com.google.guava:guava:26.0-jre'

【讨论】:

    【解决方案2】:

    从您提供的代码看来,源 hashMap 的类型似乎是 Map&lt;String, String[]&gt;

    您可以遍历映射的条目,并将每个条目的四个值存储在不同的结果容器中。由于您指出结果容器也应该是地图:

        Map<String, String> one = new HashMap<>();
        Map<String, String> two = new HashMap<>();
        Map<String, String> three = new HashMap<>();
        Map<String, String> four = new HashMap<>();
    
        hashMap.entrySet().forEach(entry -> {
            String[] values = entry.getValue();
            one.put(entry.getKey(), values[0]);
            two.put(entry.getKey(), values[1]);
            three.put(entry.getKey(), values[2]);
            four.put(entry.getKey(), values[3]);
        });
    

    注意:假设每个键总是正好有四个值。

    【讨论】:

    • 但是如何只将四个值传递给简单列表适配器上的 TA 链接,以及每个 TA 下的多个 IA 和 XA 值?
    • 我已经编辑了如何将值传递给我的 listView 的问题。请检查并告诉我。
    猜你喜欢
    • 2016-08-19
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2017-12-28
    • 2015-06-16
    • 2019-10-15
    相关资源
    最近更新 更多