如何从java.util.Set获取第一项?

Kri*_*kar 47 java set

我有一个Set实例:

Set<String> siteIdSet = (Set<String>) pContext.getParent().getPropertyValue(getCatalogProperties().getSitesPropertyName());
Run Code Online (Sandbox Code Playgroud)

pContext.getParent().getPropertyValue()是开箱即用的代码,我无法修改任何控件.

需求:

我想从中获取第一个默认元素(总是).但是,我找不到get(index)类似的方法ArrayList.

因此,现在,我这样做.

for (Iterator<String> it = siteIdSet.iterator(); it.hasNext();) {
    siteId = it.next();
    break;
}
Run Code Online (Sandbox Code Playgroud)

有没有(其他)有效的方法(简短和更好)实现这一目标?

小智 80

这将返回第一个元素

set.iterator().next();
Run Code Online (Sandbox Code Playgroud)

  • 当set为空时,通过java.util.NoSuchElementException. (5认同)

Nes*_*aev 30

或者,使用Java8:

Object firstElement = set.stream().findFirst().get();
Run Code Online (Sandbox Code Playgroud)

然后你可以马上做一些事情:

set.stream().findFirst().ifPresent(<doStuffHere>);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在缺少元素的情况下提供替代方法(我的示例返回新的默认字符串):

set.stream().findFirst().orElse("Empty string");
Run Code Online (Sandbox Code Playgroud)

如果缺少第一个元素,您甚至可以抛出异常:

set.stream().findFirst().orElseThrow(() -> new MyElementMissingException("Ah, blip, nothing here!"));
Run Code Online (Sandbox Code Playgroud)

荣誉给Alex Vulaj了促使我提供超越第一要素的初始抓取更多的例子.

  • 如果你想在`outcome`为空的情况下提供一个默认值,你可以将你的`.get()`改为`.orElse()`. (2认同)

Tay*_* Hx 29

来自Oracle文档:

正如其名称所暗示的,该界面模拟数学抽象.

集合理论中,"一个"集合是一个不同对象的集合,被视为一个独立的对象." - [维基百科 - 集].

在数学上,集合中的元素不是个性化的.他们唯一的身份来自他们在集合中的存在.因此,在集合中获取"第一"元素是没有意义的,因为从概念上讲这样的任务是不合逻辑的.

从集合中获取"first"元素可能没有意义,但如果您只需要从集合中获取单个对象(不保证哪个对象是),则可以执行以下操作:

for(String aSiteId: siteIdSet) {
    siteId = aSiteId;
    break;
}
Run Code Online (Sandbox Code Playgroud)

这是一个稍微短一些的方法(比你发布的方法)获得a的"第一"对象Set,但是由于Iterator仍在创建(在引擎盖下),它不会给予任何性能优势.

  • 然而,它有一个实际用途:有时你需要一个集合中的一些元素(任何一个)。 (2认同)

han*_*.kh 8

Set是一个独特的项目集合.所以没有第一个元素的概念.如果您想要按排序顺序排列项目,可以使用TreeSet从中使用TreeSet #first()从中检索第一个元素.

  • 如果您在Set接口级别工作,则没有第一个元素.迭代列表并使用它首先给你的元素. (2认同)

Bas*_*que 7

TL;博士

呼叫 TreeSet::first

移动元素,然后调用first().

new TreeSet<String>( 
    pContext.getParent().getPropertyValue( … )   // Transfer elements from your `Set` to this new `TreeSet`, an implementation of the `SortedSet` interface. 
).first()
Run Code Online (Sandbox Code Playgroud)

Set 没有订单

正如其他人所说,Set根据定义,没有秩序.因此,要求"第一"元素没有意义.

某些实现Set具有订单,例如添加项目的顺序.这个非正式的订单可以通过Iterator.但该命令是偶然的,不能保证.如果你很幸运,支持你的实现Set可能确实是一个SortedSet.

CAVEAT:如果订单很重要,请不要依赖此类行为.如果可靠性并不重要,那么这种无证件行为可能会很方便.如果给Set你一个你没有其他可行的选择,所以尝试这可能比没有好.

Object firstElement = mySet.iterator().next();
Run Code Online (Sandbox Code Playgroud)

直接解决问题......不,在处理空集的可能情况时,从迭代器中获取第一个元素并不是更简单的方法.但是,我更喜欢if测试isEmpty而不是问题的for循环.

if ( ! mySet.isEmpty() ) {
    Object firstElement = mySet.iterator().next();
)
Run Code Online (Sandbox Code Playgroud)

使用 SortedSet

如果您关心在a中维护排序顺序Set,请使用SortedSet实现.这些实现包括:

使用LinkedHashSet对于插入顺序

如果你需要的只是记住元素的顺序,他们被添加到Set使用a LinkedHashSet.

引用文档,这堂课......

维护一个贯穿其所有条目的双向链表.此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序.