为什么java.util.Set可以';不返回任何值?

为什么java.util.Set可以';不返回任何值?,java,set,Java,Set,java.util.Set只指定返回所有记录的方法(通过迭代器或数组) 为什么没有从集合中返回任何值的选项 这在现实生活中很有意义。例如,我有一碗草莓,我只想吃一个。我完全不在乎哪一个 为什么我不能在java中做同样的事情?Ajava.util.Set是一个无序的集合;你可以把它看作是一个包,里面装着东西,但没有任何特定的顺序。使用get(int-index)方法没有意义,因为集合中的元素没有索引 标准Java库的设计者没有包含从集合中获取随机元素的方法。如果你想知道原因,那是你只能猜测的。也许

java.util.Set
只指定返回所有记录的方法(通过迭代器或数组)

为什么没有从集合中返回任何值的选项

这在现实生活中很有意义。例如,我有一碗草莓,我只想吃一个。我完全不在乎哪一个


为什么我不能在java中做同样的事情?

A
java.util.Set
是一个无序的集合;你可以把它看作是一个包,里面装着东西,但没有任何特定的顺序。使用
get(int-index)
方法没有意义,因为集合中的元素没有索引

标准Java库的设计者没有包含从
集合
中获取随机元素的方法。如果你想知道原因,那是你只能猜测的。也许他们不认为这是必要的,或者他们甚至没有考虑过


很容易自己编写一个方法,从
集合中获取一个随机元素
a
java.util.Set
是一个无序的集合;你可以把它看作是一个包,里面装着东西,但没有任何特定的顺序。使用
get(int-index)
方法没有意义,因为集合中的元素没有索引

标准Java库的设计者没有包含从
集合
中获取随机元素的方法。如果你想知道原因,那是你只能猜测的。也许他们不认为这是必要的,或者他们甚至没有考虑过


自己编写一个从
集合中获取随机元素的方法很容易,这是不可回答的。您必须询问Java集合框架的原始设计者

一个看似合理的原因是,具有非确定性行为的方法往往存在问题:

  • 它们使得单元测试更加困难
  • 它们使虫子更难追踪
  • 它们更容易被那些懒得阅读API文档的程序员误解和误用
对于基于哈希表的集合组织,“获取某些元素”方法的行为将是不确定的,或者至少难以确定/预测

顺便说一下,您可以获得非空集合的一些元素,如下所示:

Object someObject = someSet.iterator().next();
获取一个真正的(伪)随机元素有点棘手/昂贵,因为您无法为集合中的元素编制索引。(您需要将所有集合元素提取到数组中…)



重新审视这一点,我意识到还有另一个原因。很简单,
Set
是基于集合的数学概念,数学中集合的元素没有顺序。谈论数学集合的第一个元素是毫无意义的。

这是不可回答的。您必须询问Java集合框架的原始设计者

一个看似合理的原因是,具有非确定性行为的方法往往存在问题:

  • 它们使得单元测试更加困难
  • 它们使虫子更难追踪
  • 它们更容易被那些懒得阅读API文档的程序员误解和误用
对于基于哈希表的集合组织,“获取某些元素”方法的行为将是不确定的,或者至少难以确定/预测

顺便说一下,您可以获得非空集合的一些元素,如下所示:

Object someObject = someSet.iterator().next();
获取一个真正的(伪)随机元素有点棘手/昂贵,因为您无法为集合中的元素编制索引。(您需要将所有集合元素提取到数组中…)



重新审视这一点,我意识到还有另一个原因。很简单,
Set
是基于集合的数学概念,数学中集合的元素没有顺序。谈论一个数学集合的第一个元素是毫无意义的。

好吧,像这样做一点工作就可以了

    Set<String> s = new HashSet<String>();
    Random r = new Random();
    String res = s.toArray(new String[0])[r.nextInt(s.toArray().length)];
Set s=newhashset();
随机r=新随机();
字符串res=s.toArray(新字符串[0])[r.nextInt(s.toArray().length)];

这将从集合中随机选择一个对象。

好吧,您只需做一点这样的工作就可以了

    Set<String> s = new HashSet<String>();
    Random r = new Random();
    String res = s.toArray(new String[0])[r.nextInt(s.toArray().length)];
Set s=newhashset();
随机r=新随机();
字符串res=s.toArray(新字符串[0])[r.nextInt(s.toArray().length)];

这将从集合中获取随机选择的对象。

实际上,迭代器比使用get(position)要好得多(这是可以在
java.util.List
上执行的操作)。一方面,它允许在迭代过程中修改集合。没有将它们放在集合中的原因可能是因为它们中的大多数不能保证插入顺序。您总是可以执行类似于
newarraylist(mySet).get(position)
的操作,实际上迭代器比使用get(position)要好得多(这是可以在
java.util.List
上执行的操作)。一方面,它允许在迭代过程中修改集合。没有将它们放在集合中的原因可能是因为它们中的大多数不能保证插入顺序。您始终可以执行类似于
新建ArrayList(mySet)的操作。获取(位置)

如果您不关心元素的索引,请尝试使用队列而不是Set

    Queue q = new ArrayDeque();
    q.element(); // retrieves the first object but doesn't remove
    q.poll(); // retrieves and removes first object

如果您不关心元素的索引,请尝试使用Queue而不是Set

    Queue q = new ArrayDeque();
    q.element(); // retrieves the first object but doesn't remove
    q.poll(); // retrieves and removes first object

虽然普通集合没有什么特别之处,但SortedSet和NavigableSet提供了一个有保证的顺序和支持该顺序的方法。您可以使用和

SortedSet set=。。。
e1=set.first();//价值
E e2=set.last();//也是一种价值。

虽然普通集合没有什么特别之处,但SortedSet和NavigableSet提供了有保证的顺序和支持该顺序的方法。您可以使用和

SortedSet set=。。。
e1=set.first();//价值
E e2=set.last();//也是v