Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以自然顺序在集合中存储唯一元素_Java_Collections - Fatal编程技术网

Java 以自然顺序在集合中存储唯一元素

Java 以自然顺序在集合中存储唯一元素,java,collections,Java,Collections,在解决Java测试时,我提出了以下问题: 您需要在集合中存储元素,以确保 存储重复项,所有元素都可以自然访问 秩序。哪个接口提供了这种功能 我不知道这里的情况是什么?我们可以在这些集合中的任何集合中存储相同的元素,除非在集合中,但是集合不提供自然顺序。怎么了?TreeSet会给您排序(默认情况下是自然排序,而不是通过比较器自定义排序) 更一般地说,是提供唯一性和顺序的更通用的接口 进一步对其元素提供总排序的集合。元素使用其自然顺序进行排序,或通过通常在排序集创建时提供的比较器进行排序。集合的迭代

在解决Java测试时,我提出了以下问题:

您需要在集合中存储元素,以确保 存储重复项,所有元素都可以自然访问 秩序。哪个接口提供了这种功能


我不知道这里的情况是什么?我们可以在这些集合中的任何集合中存储相同的元素,除非在
集合
中,但是
集合
不提供自然顺序。怎么了?

TreeSet会给您排序(默认情况下是自然排序,而不是通过比较器自定义排序)

更一般地说,是提供唯一性和顺序的更通用的接口

进一步对其元素提供总排序的集合。元素使用其自然顺序进行排序,或通过通常在排序集创建时提供的比较器进行排序。集合的迭代器将按元素升序遍历集合。提供了几个附加操作以利用订购


TreeSet将为您提供排序(默认情况下,通过比较器进行自然排序或自定义排序)

更一般地说,是提供唯一性和顺序的更通用的接口

进一步对其元素提供总排序的集合。元素使用其自然顺序进行排序,或通过通常在排序集创建时提供的比较器进行排序。集合的迭代器将按元素升序遍历集合。提供了几个附加操作以利用订购


如果自然顺序是指插入顺序,那么LinkedHashSet是您的go-to-Set实现

正确答案如下: SortedSet就元素的自然顺序提供保证。
TreeSet是典型的实现

如果按自然顺序,您指的是插入顺序,那么LinkedHashSet是您的go-to-Set实现

正确答案如下: SortedSet就元素的自然顺序提供保证。
TreeSet是典型的实现

严格来说,当从上面的
列表中选择时
是唯一具有定义的迭代顺序的接口,但是它允许重复

另一方面,
Set
Map
不允许重复(用于
Map
的键),但它们也不定义迭代顺序,默认情况下,它们是无序的,
HashSet
/
HashMap
是反例

集合
不允许任何集合

因此,严格地说,没有一个建议的接口提供所需的功能, 然而,正如其他人所建议的,接口的一些特定实现允许元素的自然顺序,并且不允许重复,主要是接口及其实现


为了进一步解释为什么
Set
不是一个好的选项,如果您有一个变量,让它成为
mySet
,并且您希望对它进行排序,当您使用
Set
界面时,用户会感到惊讶,请输入以下代码:

public int processMyDataStructure(Set set) {
   //some calculation that assumes set is ordered
   return result;
}

用户向您提供一个
HashSet
作为参数-您将从方法中获得错误的行为,因为
Set
不能保证排序。为了避免这种情况,您应该要求使用
分类数据集
,而不是

,严格来说,当从上述
列表中进行选择时,
是唯一具有定义的迭代顺序的接口,但是它允许重复

另一方面,
Set
Map
不允许重复(用于
Map
的键),但它们也不定义迭代顺序,默认情况下,它们是无序的,
HashSet
/
HashMap
是反例

集合
不允许任何集合

因此,严格地说,没有一个建议的接口提供所需的功能, 然而,正如其他人所建议的,接口的一些特定实现允许元素的自然顺序,并且不允许重复,主要是接口及其实现


为了进一步解释为什么
Set
不是一个好的选项,如果您有一个变量,让它成为
mySet
,并且您希望对它进行排序,当您使用
Set
界面时,用户会感到惊讶,请输入以下代码:

public int processMyDataStructure(Set set) {
   //some calculation that assumes set is ordered
   return result;
}

用户向您提供一个
HashSet
作为参数-您将从方法中获得错误的行为,因为
Set
不能保证排序。为了避免这种情况,你应该要求一个
分类数据集
而不是

该测试的正确答案是
让我们记住,它要求的是一个能够提供该功能的接口;鉴于正确的实现
设置
接口可以提供它

  • Map
    接口不能保证存储的顺序,因为这是特定于实现的。但是,如果您使用了正确的实现(即,如文档所述),则可以保证自然排序,并且没有重复条目

    但是,没有关于键值对的要求

  • Set
    接口也不能保证事物的存储顺序,因为这是特定于实现的。但是,像
    TreeMap
    一样,它是一个集合,可以用来按自然顺序存储东西,没有重复项

    这是它的样子

    Set<String> values = new TreeSet<>();
    
    …但是你会丢失关于它实际上是什么样的收藏的信息,所以我不鼓励使用它


    • 该测试的正确答案是
      Set
      让我们记住它是
      Collection<String> values = new TreeSet<>();