当前位置: 首页 > 知识库问答 >
问题:

一张地图可以同时包含键和值作为集合吗

郭业
2023-03-14

我创建了一个树映射,它的参数类型为Set,既有key-value,也有TreeSet,因此key和value对总是相互对应的。但我得到了一个错误:

Exception in thread "main" java.lang.ClassCastException: java.util.TreeSet  cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1290)
at java.util.TreeMap.put(TreeMap.java:538)
at hello.Sam.main(Sam.java:49)`

下面是代码:

package hello;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Sam {

public static void main(String args[])
{
    Set<String> set=new TreeSet<String>();
    Set<String> set2=new TreeSet<String>();
    List<String> list=new ArrayList<String>();
    list.add("hello1");
    list.add("bye1");
    list.add("bye2");
    list.add("bye3");
    list.add("bye4");
    list.add("bye5");
    list.add("bye6");
    Map<Set<String>,Set<String>> map=new TreeMap<Set<String>,Set<String>>();

    set.add("set11");
    set.add("set12");
    set.add("set13");
    set.add("set14");
    set.add("set15");
    set.add("set16");
    set.add("set17");

    set2.add("set21");
    set2.add("set21");
    set2.add("set21");
    set2.add("set21");
    set2.add("set21");
    set2.add("set21");
    set2.add("set21");

    map.put(set,set2);
    System.out.println(map);
    }

}

但是,当我使用键或值作为字符串(String,Set)或(Set,String)时,效果很好。

我不能同时拥有密钥和值作为集合吗?或者如果是,如何使用它们??

共有3个答案

傅皓君
2023-03-14

TreeMap是一个SortedMap。它将只接受实现可比较的键,或者您可以在初始化期间在TreeMap的构造函数中传递比较器对象。

插入到排序映射中的所有键必须实现可比接口(或者被指定的比较器接受)。

此外,所有这些密钥必须相互可比:k1。compareTo(k2)(或comparator.compare(k1,k2))不能为排序映射中的任何键k1和k2抛出ClassCastException。

尝试违反此限制将导致违规方法或构造函数调用抛出ClassCastExcure。

如果排序不重要,可以使用HashMap:

Map<Set<String>,Set<String>> map = new HashMap<Set<String>,Set<String>>();
扈阳辉
2023-03-14

TreeSet的默认构造函数

您可以为树映射提供自定义比较器

另外,HashSet要求更少,所以如果您不需要按顺序存储映射中的值,您可以使用HashMap

璩无尘
2023-03-14
 Map<Set,Set> map=new HashMap();
 Set s=new HashSet();
 Set s1=new HashSet();
 s.add("asd");
 s.add("a1sd");
 s.add("as2d");
 s.add("asd2");
 s.add("asd3");
 s1.add("asd");
 s1.add("a1sd");
 s1.add("as2d");
 s1.add("asd2");
 s1.add("asd3");
 map.put(s, s1);
    System.out.println(map);

以上程序对我来说很好。

 类似资料:
  • 我有两张地图被定义为

  • 问题内容: 什么类型的Java集合可为同一键返回多个值? 例如,我想为键300返回301,302,303。 问题答案: 您可以使用a 作为您的值: 另外,您可以按照biziclop的建议从Guava 中使用它,它的语法更加简洁,并且还有许多其他非常有用的实用程序方法:

  • 问题内容: 如下面的代码: 输出为: 是否可以将地图的键设置为准确的数据,而不仅仅是对象的地址?怎么样? 问题答案: 使用JSON时,可以在地图中将对象作为键吗? 严格没有。JSON 映射 数据结构是JSON 对象 数据结构,它是名称/值对的集合,其中元素名称必须是字符串。因此,尽管以映射的形式感知并绑定到JSON对象是合理的,但是JSON映射键也必须是字符串- 再次,因为JSON映射是JSON对

  • 问题内容: 我需要一个可以根据键查找值的集合,反之亦然。每个值都有一个键,每个键都有一个值。有没有可以立即使用的数据结构呢? 问题答案: 该BIMAP从谷歌番石榴看起来会适合你。 双向映射(或“双向映射”)是一种保留其值以及其键的唯一性的映射。此约束使bimap可以支持“反向视图”,这是另一个bimap,它包含与此bimap相同的条目,但具有相反的键和值。 或来自Apache Commons Co

  • 我有一个集合,其中每个文档都有一些公共数据,如用户名和字符级别,但也有一个私有子集合,它有字符的黄金量。 现在我可以查询特定文档的characters collection,但是子collection数据不会返回,所以我需要执行二次查询来检索它。

  • 所以我有两个相同的映射,字符串作为键,整数作为值,我知道在某些事件之后,map2中只有1个值递增1。 所以我的问题是如何返回“第二”键,因为它的值增加了1。