Java:根据内部映射对Map进行排序,Map<Long,Map<String, Data>>

标签 java list dictionary

我是java新手,还在学习阶段。 我有一个结构

Map<Long, Map<String, Data>> mapData

Data有 2 个字段 timedistanceMap有一个时间是 Long场和mapIdentifierData 结构如下所示

{190001919 = {[1= [data1], 2=[data2], 3=[data3]}, 
190001920={[1=[data4], 2=[data5], 3=[data6]}, 
1900019121= {[1=[data7], 2=[data8], 3=[data9]}}

然后将其转换为 map - Map<String,List<Data>> mpDataidenifierkeyvalues因为标识符的值是相同的。

喜欢

{1= [data1,data4,data7], 2= [data2,data5,data8],3= [data3,data6,data9]}

有人可以帮我吗? 更新: 通过下面的代码,我得到

{1= [data7,data7,data7], 2= [data8,data8,data8],3= [data9,data9,data9]}

而不是

 {1= [data1,data4,data7], 2= [data2,data5,data8],3= [data3,data6,data9]}

代码:

public static Map<Long, Map<String, Data>> listData;
public static Map<String, List<Data>> mapData;
public convertMapData(Map<Long, Map<String, Data>> array) {
        listData = new HashMap();
        listData = array;
        mapData = new HashMap<>();
        Iterator it = listData.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<Long, Map<String, Data>> pairs = (Map.Entry) it
                    .next();
            Long keyValue = pairs.getKey();
            Map inter = pairs.getValue();

            Iterator it2 = inter.entrySet().iterator();
            while (it2.hasNext()) {
                Map.Entry<String, Data> pairs_2 = (Map.Entry) it2
                        .next();
                String identifierK = pairs_2.getKey();
                Data resultV = pairs_2.getValue();
                if (!(mapData.containsKey(identifierK))) {
                    mapData.put(identifierK, new ArrayList<Data>());
                }
                mapData.get(identifierK).add(resultV);      
            }
        }

}

最佳答案

  1. 定义Map<String,List<Data>> listData = new HashMap<String, List<Data>>();
  2. 迭代mapData的值(看来您没有使用该 map 的键)。
  3. 对于 mapData 的每个值,这又是一张 map ,迭代 entrySet ,它为您提供每个条目的键( String ,我们称之为 K )和值(一个 Data 对象,我们称之为 V )。
  4. 检查您的 listData已经有像 K 这样的 key (使用 containsKey() ),如果没有,则添加一个,使用 listData.put(K, new ArrayList<Data>())
  5. 添加V到为 key 存储的列表:listData.get(K).add(V)

仅此而已。正如 Rohit Jain 评论的那样,您不需要 listData map 周围的列表。

试试这个:

public Map<String, List<Data>> convert(Map<Long, Map<String, Data>> array) {
    Map<String, List<Data>> result = new HashMap<String, List<Data>>();
    for (Map<String, Data> inter : array.values()) {
        for (Map.Entry<String, Data> entry : inter.entrySet()) {
            String k = entry.getKey();
            String v = entry.getValue();
            if (!result.containsKey(k)) {
                result.put(k, new ArrayList<Data>());
            }
            result.get(k).add(v);      
        }
    }
    return result;
}

关于Java:根据内部映射对Map进行排序,Map<Long,Map<String, Data>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18954767/

相关文章:

根据从另一个列表中删除的 ID 从一个列表中删除值

performance - 戈朗 : Find two number index where the sum of these two numbers equals to target number

windows - 在 Windows Batch 中迭代键值对

for-loop - 在循环中将条目添加到 map

java - 在 Java 中使用在运行时确定的实例上的方法引用

c++ - 对象列表中的变量不会改变

java - 在java中验证mailto链接

c++ - std::forward_list 中可以存在循环吗?

java - 为什么我的应用程序不从 fragment 中打开新的 Activity?

java - 如何从父类获取执行的Java子类名?