【问题标题】:Compare Hashmap String value and duplicate key for Repeated entry比较 Hashmap String 值和重复项的重复键
【发布时间】:2016-03-31 06:34:43
【问题描述】:

我正在使用

Map<Integer, String> adi = new HashMap<Integer, String>();
for(int u=0; u< sari_nodes.size();u++){
    adi.put(u, sari_nodes.get(u));
}

for (Map.Entry<Integer, String> entry : adi.entrySet()) {
    tv.setText(tv.getText()+"Key : " + entry.getKey()+ " Value : " + entry.getValue()+"\n");
}

我的输出是:

key: 0 Value : cat
key: 1 Value : dog    
key: 2 Value : car    
key: 3 Value : car    
key: 4 Value : car    
key: 5 Value : car

我想为同一个条目重复该键,以便我的输出看起来像

key: 0 Value : cat    
key: 1 Value : dog    
key: 2 Value : car    
key: 2 Value : car    
key: 2 Value : car    
key: 2 Value : car

如何执行检查以获取这些重复的密钥?

有人可以指导我解决这个问题吗?

谢谢。

【问题讨论】:

  • 你的代码没有显示sari_nodes,可能考虑更新它以显示这个。
  • sari_node 包含单词和重复的单词,例如 car , dog , cat , room ,任何单词或名称,它的大小可以很多..这就是为什么我将它们存储在 arrayList 然后得到它们以值的形式存储在地图中
  • 为什么要为sari_nodes.size() 中剩余的u 号码返回Key 2?这似乎是多余的,因为您排除了列表中的其他值。
  • 其实你只是一个for循环处理程序。我用它来分配一个单独的键。但是我想检查是否出现重复值,其中已经为汽车分配了 2 个键,并且再次出现值汽车,它应该添加 2 作为键。我需要准确跟踪键和准确的顺序
  • 旁注:如果您希望 HashMap 具有唯一性,请将您的键与值交换。 Hashmap 不能包含重复的键。为重复键输入的最新值将保留。

标签: java android dictionary arraylist hashmap


【解决方案1】:

我赞同NameSpace的回答。

您希望每个值都是唯一的。因此,为此您可以创建一个地图,将当前地图的值添加为键。最终,我们试图为相同的值获取相同的键(第一个键)。您可以通过以下方式进行。

Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "cat");
map.put(2, "dog");
map.put(3, "car");
map.put(4, "cat");
map.put(5, "dog");
map.put(6, "dog");

Map<String, Integer> uniqueValues = new HashMap<>();

for (Entry<Integer, String> entry : map.entrySet()) {
    Integer key = entry.getKey();
    String val = entry.getValue();
    if (uniqueValues.containsKey(val)) {
        key = uniqueValues.get(val);
    }

    uniqueValues.put(val, key);
    System.out.println("Key : " + key + " - Value : " + val);
}

输出

Key : 1 - Value : cat
Key : 2 - Value : dog
Key : 3 - Value : car
Key : 1 - Value : cat
Key : 2 - Value : dog
Key : 2 - Value : dog

注意:区分大小写,在上面的代码中它会认为Dogdog两者是不同的。

【讨论】:

  • 我明白了...效果很好..非常感谢...非常感谢您的知识。
【解决方案2】:

你可以试试下面的代码:

Map<Integer, String> adi = new HashMap<>();

adi.put(0, "cat");
adi.put(1, "dog");
adi.put(2, "car");
adi.put(3, "car");
adi.put(4, "car");
adi.put(5, "PC");

int lastKey = 0;
String lasValue = "";
for (Map.Entry<Integer, String> entry : adi.entrySet()) {
    if (!entry.getValue().equals(lasValue)) {
        lastKey = entry.getKey();
    }
    lasValue = entry.getValue();
    //tv.setText(tv.getText()+"Key : " + lastKey+ " Value : " + entry.getValue()+"\n");
    System.out.println("Key : " + lastKey+ " Value : " + entry.getValue());
}

这是输出:

Key : 0 Value : cat
Key : 1 Value : dog
Key : 2 Value : car
Key : 2 Value : car
Key : 2 Value : car
Key : 5 Value : PC

【讨论】:

  • 我只想指出这个解决方案假设他所有的重复值都是连续出现的。
  • 一个很好的解决方案......连续重复。
【解决方案3】:

您只需制作第二张地图,并在您遍历第一张地图的元素时,将键值翻转为第二张地图的值键。如果第一个 map 的 value 已经作为 key 添加到第二个 map 中,则不要覆盖,并将 key-stored-as-a-value 输出在后者中,否则输出新的 key。

【讨论】:

  • 我是 Hashmaps 的新手 .. 你能举个例子如何实现它吗?而且这些值是动态的,可以有4对以上的重复词。是否所有重复值都具有 2 个映射的相同键..?
  • 哈希映射不会跟踪一个值是否与多个键相关联,因此一种解决方案是遍历它,检查哪些值是重复的。将第一个映射的值作为键添加到第二个映射中,您可以检查哪些值已被使用。如果尚未添加密钥,您只会写入第二个地图。您似乎还想重复第一次出现的第一个键(或订单值),您也可以将其存储在这里。
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多