微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我想插入相同的键时,如何增加 TreeMap 的键?

如何解决当我想插入相同的键时,如何增加 TreeMap 的键?

我有一个 TreeMap,其中有一个 id(键)列表和更多作为值的数据。因此,当我向 TreeMap 插入一个键和值时,当键不在 TreeMap 中时它会顺利进行。问题是它在那里的时候。我必须从新的 Key 中更新所有的 Key,这样新 Key 将在他的位置,而之前在该位置的将在下一个

示例:
:1 :a
:2 :b
:3 :c
:4 :d
关键:5 价值:e

插入键 3,值 f:
:1 :a
:2 :b
:3 :f
:4 :c
:5 :d
关键:6 价值:e

解决方法

Map 的行为与其应有的完全一样:Map 中的每个键都是唯一的。意思是:没有重复的键。如果您put 一个条目的键已经存在,它将覆盖旧条目。

如果您只想要一个递增的项目列表,请使用 List

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");

打印出来:

for(int i=0; i<list.size(); i++) {
  System.out.println("Key: " + (i+1) + " Value: " + list.get(i));
}

当你现在想在中间插入一些东西时,只需将 add 与索引一起使用:

list.add(2,"f");

打印结果:

Key: 1 Value: a
Key: 2 Value: b
Key: 3 Value: f
Key: 4 Value: c
Key: 5 Value: d
Key: 6 Value: e
,

您尚未指定如何使用地图,也未指定您的密钥是否比指定的更复杂和随机。所以我提供了一个不同的可能性。

  • 首先,创建一些数据。
int[] keys = { 1,5,7,10,12,15,40,50,18,8,3,4,14,19 };
String[] values = "abcdefghijklmnopqrstuvwxyz".split("");
  • TreeMap<Integer,List<String>> 开始
  • 然后按如下方式存储它们:
NavigableMap<Integer,List<String>> map = new TreeMap<>();


for(int i = 0; i < keys.length; i++) {
    map.computeIfAbsent(keys[i],v-> new ArrayList<>()).add(values[i]);
}

map.entrySet().forEach(System.out::println);

打印(每个元素都在与其原始 ID 关联的列表中)

1=[a]
3=[n]
4=[o]
5=[b,p]
7=[c]
8=[l]
10=[d,k,m,q]
12=[e,r]
14=[s]
15=[f]
18=[j]
19=[t]
40=[g,h]
50=[i]
  • 现在创建另一个映射以提供键到元素的一对一映射。
int start = map.firstKey();
for(int key : map.keySet()) {
    start = key < start ? start : key;
    for (String v : map.get(key)) {
        map2.put(start++,v);
    }
    
    
}
System.out.println(map2);

印刷品

{1=a,3=n,4=o,5=b,6=p,7=c,8=l,10=d,11=k,12=m,13=q,14=e,15=r,16=s,17=f,18=j,19=t,40=g,41=h,50=i}

关键是,如果您的 ids 不是从 0 开始的顺序,则您不能使用列表,因为列表的索引之间不能有间隙。否则,列表就可以了。

,

使用 for 循环从列表中添加相同的项目。 如果 Map 已经添加了该键(字符串),则将旧值(整数)替换为获取它并将其递增 1

> List<String> list = new ArrayList<>(List.of("A","B","C","D",> "E","E","F","G","H"));
>     Map<String,Integer> letters = new HashMap<>();
>     for (String s : list) {
>         if (letters.containsKey(s)) {
>             letters.put(s,letters.get(s) + 1);
>         } else {
>             letters.put(s,1);
>         }
,

对于示例中给出的简单用例,您可以尝试如下操作,假设您的键是连续的:

public static void main(String[] args) {
    Map<Integer,String> map = new TreeMap<>();
    map.put(1,"a");
    map.put(2,"b");
    map.put(3,"c");
    map.put(4,"d");
    map.put(5,"e");

    System.out.println("Before inserting new key value pair:");
    System.out.println(map);
    
    int newKey = 3;
    String newValue = "f";

    if (map.containsKey(newKey)) {
        map.keySet().stream()
                .filter(e -> e >= newKey)
                .collect(Collectors.toCollection(ArrayDeque::new))
                .descendingIterator()
                .forEachRemaining(e -> {
                    map.put(e + 1,map.get(e));
                });
    }
    
    map.put(newKey,newValue);
    System.out.println("\nAfter inserting new key value pair:");
    System.out.println(map);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。