我想获得一张包含订单和重复的地图。
Map<String, Boolean> map = ?;
map.put("abc", true);
map.put("cba", true);
map.put("cba", true);
map.put("bca", false);
map.put("bac", false);
map.put("bca", true);
map.put("cab", true);
map.put("cba", true);
map.put("cba", false);
map.put("cba", true);
System.out.println(map);
我使用了LinkedHashMap,但它不允许重复。
Expected: {abc=true, cba=true, cba=true, bca=false, bac=false, bca=true, cab=true, cba=true, cba=false, cba=true}
Retrieved: {abc=true, cba=true, bca=true, bac=true, cab=true}
是否有任何地图界面实现来实现我的目标?
UPD
Guava MultiMap不适合我的问题。
Multimap<String, Boolean> map = ArrayListMultimap.<String, Boolean>create();
打印
{cab=[true], abc=[true], cba=[true, true, true, false, true], bac=[false], bca=[false, true]}
UPD2
我找到了解决方案。 Apache Commons
提供了元组类型Pair
。
所以我的代码可能看起来像这样
List<Pair<String, Boolean>> list = new ArrayList<>();
list.add(new ImmutablePair("abc", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("bca", true));
list.add(new ImmutablePair("bac", true));
list.add(new ImmutablePair("bca", true));
list.add(new ImmutablePair("cab", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("cba", true));
现在打印
[(abc,true), (cba,true), (cba,true), (bca,true), (bac,true), (bca,true), (cab,true), (cba,true), (cba,true)]
但我仍然确定它应该是适当地图的一些好的实现。
答案 0 :(得分:1)
您可以执行以下操作来存储带有重复项的有序列表。
List<String> map = new ArrayList<>();
map.add("abc" + '=' + true);
map.add("cba" + '=' + true);
map.add("cba" + '=' + true);
map.add("bca" + '=' + false);
map.add("bac" + '=' + false);
map.add("bca" + '=' + true);
map.add("cab" + '=' + true);
map.add("cba" + '=' + true);
map.add("cba" + '=' + false);
map.add("cba" + '=' + true);
System.out.println(map);
要创建一个Tuple类,你可以
public class Tuple<L,R> {
private L left;
private R right;
Tuple(L left, R right) {
this.left = left;
this.right = right;
}
public static <L, R> Tuple<L, R> of(L left, R right) {
return new Tuple<>(left, right);
}
public L left() { return left; }
public R right() { return right; }
public String toString() { return left + "=" + right; }
}
但是,在Java中,通常最好给这个类和字段名称一个有意义的名称和类型,而不是没有附加含义的通用数据元组。
答案 1 :(得分:0)
显然,您担心在地图中打印的输出格式。如果是这种情况,那么您可以使用现有的实现,只需覆盖toString()
方法。
如果出于某种原因,您需要有关输入到地图的条目的绝对顺序的信息,您需要自己编写实现,为您执行此操作,因为使用当前实现只会保持相对于每个键,但不是绝对顺序。