【问题标题】:Group the map values to avoid duplicate [duplicate]对地图值进行分组以避免重复[重复]
【发布时间】:2017-05-09 09:46:15
【问题描述】:

我有一个 Map(map1),它的键是另一个 map(map2),值是字符串。

map1的值有多个重复,所以我必须将它们分组并设置为另一个map3的键,其值必须是map2。

eg:

map1 {  [[a,b],xyz],  [[c,d],wrt] , [[e,f],xyz] , [[r,m],xyz]  }


output should be :

map3 {  [ xyz,[ [a,b],[e,f],[r,m] ] ]  , [ wrt,[ [c,d] ]

我可以这样获得吗?

【问题讨论】:

  • 您可以将第一张地图转换为一个集合,然后将其与map2结合为map3。
  • 你的目标是用 value 反转 key 所以如果 map1 是 Map<K,V> 你想从中得到 Map<V,K>
  • map1 似乎是一个列表,我认为您应该更清楚地提出您的问题。
  • 应该 "map3 { [ xyz,[ [a,b],[e,f],[r,m] ] ] , [ wrt,[ [c,d] ]" 未读" map2 { [ xyz,[ [a,b],[e,f],[r,m] ] ] , [ wrt,[ [c,d] ]" ?错字?

标签: java collections


【解决方案1】:

从(commons-collections)库中尝试 MultiValueMap

Map map1 = new HashMap<String[], String>();
map1.put(new String[]{"a", "b"}, "xyz");
map1.put(new String[]{"c", "d"}, "wrt");
map1.put(new String[]{"e", "f"}, "xyz");
map1.put(new String[]{"c", "d"}, "xyz");

MultiValueMap map2 = new MultiValueMap();
for(String[] key: map1.keySet()) {
    String value = map1.get(key);
    map2.add(value, key);
}
// now you got map2 as you want

【讨论】:

  • 我没有看到 MultiValueMap 与 OP 的情况的相关性
  • 已更新详细代码
  • 现在我看到了相关性:)
【解决方案2】:

不,虽然你可以声明它,但在使用它时,它可能允许相同的键(人类可读)。因为Map 不会覆盖Object 的equals 方法,所以您的键比较将在JVM 的对象级别进行(对于其中具有相同值的对象,可能会有所不同)。

【讨论】:

  • Map 是一个接口,为什么要覆盖equals。顺便说一句:AbstractMap 覆盖 equals 和大多数(或全部?)java.util 的实现扩展这个类。
  • 这里Map 是(我认为很明显)Map 接口的可靠实现。而且您不会创建Map 的另一个实现,因此您将无法编辑以前的JAVA 提供的实现来覆盖equals。这就是答案是 NO 的原因
【解决方案3】:

你可以使用stream API来解决它:

Map<String, List<Map<String, String>>> map3 = map.entrySet().stream()
    .collect(Collectors.groupingBy(Entry::getValue,
                                   Collectors.mapping(Entry::getKey,
                                                      Collectors.toList())));

说明: 条目将按其值分组 (groupingBy(Entry::getValue)。 但是这些值不应该是条目列表,因此 downstream 是必要的。这是原始地图的键列表。

【讨论】:

    【解决方案4】:

    从您的帖子中不清楚map2 是什么意思,但我们假设您希望将map2 中的每个Map.Entry&lt;String, String&gt; entry 用于map1 的每个键。

    以下代码是 Java 7,有点冗长。我猜它可以用 Java 8 流来做的更短。

    public class MapReverser {
    
        private Map<Map.Entry<String, String>, String> map1 = new HashMap<>();
    
        private Map<String, String> map2 = new LinkedHashMap<>();
    
        private void prepareMaps() {
            map2.put("a", "b");
            map2.put("c", "d");
            map2.put("e", "f");
            map2.put("r", "m");
    
            String[] valueArray = { "xyz", "wrt", "xyz", "xyz" };
            int i = 0;
            for (Map.Entry<String, String> entry : map2.entrySet()) {
                map1.put(entry, valueArray[i]);
                i++;
            }
        }
    
        public Map<String, List<Map.Entry<String, String>>> reverse() {
            Map<String, List<Map.Entry<String, String>>> reversedMap = new HashMap<>();
            for (Map.Entry<Map.Entry<String, String>, String> entry : map1.entrySet()) {
                List<Map.Entry<String, String>> reversedMapValue = reversedMap.get(entry.getValue());
                if (reversedMapValue == null) {
                    reversedMapValue = new ArrayList<>();
                }
                reversedMapValue.add(entry.getKey());
                reversedMap.put(entry.getValue(), reversedMapValue);
            }
            return reversedMap;
        }
    
        private void printResult(Map<String, List<Map.Entry<String, String>>> reversedMap) {
            for (Map.Entry<String, List<Map.Entry<String, String>>> entry : reversedMap.entrySet()) {
                System.out.println("Key: \n" + entry.getKey());
                System.out.println("Values:");
                List<Map.Entry<String, String>> valuesList = entry.getValue();
                for (Map.Entry<String, String> value : valuesList) {
                    System.out.println(value );
                }
                System.out.println("\n");
            }
        }
    
        public static void main(String[] args) {
            MapReverser mapReverser = new MapReverser();
            mapReverser.prepareMaps();
            Map<String, List<Map.Entry<String, String>>> reversedMap = mapReverser.reverse();
            mapReverser.printResult(reversedMap);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多