是否有一个Java Map类可以满足这些需求



是否有Java Map类可以满足以下功能:

  1. 这是一个形式为UnknownMap<Key, Object>的泛型类,我计划在基于节点的应用程序中使用它,其中每个节点都存储在此映射中,并对应于像UnknownMap<Float, Node>这样的浮点值对象。

  2. 它可以存储可以映射到相同浮点值的对象,例如:

UnknownMap<Float, String> map = new UnknownMap<Float, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
map.put(1, "d");
System.out.println(map);

将打印出:{1="a", 1="d", 2="b", 3="c"},而不是:{1="d", 2="b", 3="c"}

  1. 它有一个名为subMap的方法,它返回一个映射,其中所有节点都在一个键范围内,类似于TreeMap.subMap

  2. 它必须对浮点键值执行二进制搜索以检索正确的对象,而不是遍历整个集合。它需要快速,因为可能会有数千甚至数百万个节点。

这样的类存在吗?还是我必须从头开始写一个?

谢谢。

使用Map.computeIfAbsent这样试试:

第一次遇到键时,它会创建一个列表并将字符串添加到其中。下一次,它只将字符串添加到此列表中。这是一种将多个值映射到同一个键的技术。

Map<Float,List<String>> map = new HashMap<>();      
map.computeIfAbsent(10f, k->new ArrayList<>()).add("a");
System.out.println(map);
map.computeIfAbsent(10f, k->new ArrayList<>()).add("b");
System.out.println(map);                 
map.computeIfAbsent(30f, k->new ArrayList<>()).add("c");
System.out.println(map);                 
map.computeIfAbsent(30f, k->new ArrayList<>()).add("d");
System.out.println(map);                 
map.computeIfAbsent(10f, k->new ArrayList<>()).add("e");
System.out.println(map);

每次添加后打印以下内容以查看地图的更改。

{10.0=[a]}
{10.0=[a, b]}
{30.0=[c], 10.0=[a, b]}
{30.0=[c, d], 10.0=[a, b]}
{30.0=[c, d], 10.0=[a, b, e]}

您也可以使用Map.conte((的类似技术将新字符串连接到现有字符串。由于lambda中的变量必须是有效的final,因此最容易通过在方法中隔离映射来实现。

Map<Float, String> map2 = new HashMap<>();
add(10f, "a", map2);
add(10f, "b", map2);
add(30f, "c", map2);
add(30f, "d", map2);
add(10f, "e", map2);

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

打印

30.0=c, d
10.0=a, b, e

方法


public static void add(float key, String value, Map<Float, String> map) {
map.compute(key,
(k, v) -> v == null ? value : v + ", " + value);
}

TreeMap将完成这项工作。使"value"部分成为List(或可能是Set(,以处理"一个键可以映射到多个值"子句:

public void put(float k, String v) {
map.computeIfAbsent(k, k_ -> new ArrayList<String>()).add(v);
}

例如。

最新更新