如何在不迭代的情况下获取给定 LinkedHashSet 元素的索引?
有可能吗?
假设您的
private Set<String> names = new LinkedHashSet<String>();
字符串
是“Mike”、“John”、“Karen”。
是否有可能在不迭代的情况下得到“1”来返回“John”的索引是什么?
以下工作正常..带着这个问题我想知道是否有更好的方法
for (String s : names) {
++i;
if (s.equals(someRandomInputString)) {
break;
}
}
Is it even possible?
Say you have
private Set<String> names = new LinkedHashSet<String>();
and Strings
are "Mike", "John", "Karen".
Is it possible to get "1" in return to "what's the index of "John" without iteration?
The following works fine .. with this question i wonder if there is a better way
for (String s : names) {
++i;
if (s.equals(someRandomInputString)) {
break;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
Set
接口 没有像indexOf()
方法这样的东西。您确实需要迭代它或使用List
接口 相反,它提供indexOf()
方法。如果您愿意,将
Set
转换为List
非常简单,只需通过Set
的构造函数传递Set
就可以了。代码>列表实现。例如The
Set
interface doesn't have something like as anindexOf()
method. You'd really need to iterate over it or to use theList
interface instead which offers anindexOf()
method.If you would like to, converting
Set
toList
is pretty trivial, it should be a matter of passing theSet
through the constructor of theList
implementation. E.g.这是一个执行插入、删除、保留操作的实现,由数组列表支持以在 get(index) 上实现 o(1)。
测试它:
哪个输出:
当然,remove、removeAll、retainAll 现在具有与 ArrayList 相同或更差的性能。但我不使用它们,所以我对此表示同意。
享受!
编辑:
这是另一个实现,它不会扩展 LinkedHashSet,因为这是多余的。相反,它使用 HashSet 和 ArrayList。
现在你有两个实现,我更喜欢第二个。
Here is an implementation that does insertions, removals, retainings, backed by an arraylist to achieve o(1) on get(index).
To test it:
Which outputs:
Ofcourse remove, removeAll, retainAll now has the same or worse performance as ArrayList. But I do not use them and so I am ok with that.
Enjoy!
EDIT:
Here is another implementation, which does not extend LinkedHashSet because that's redundant. Instead it uses a HashSet and an ArrayList.
Now you have two implementations, I would prefer the second one.
我不这么认为,但是您可以创建一个
LinkedHashSetWithIndex
包装类来为您进行迭代,或者保留一个单独的表,其中包含每个条目的索引(如果性能下降对于您来说是可以接受的)用例。I don't believe so, but you could create a
LinkedHashSetWithIndex
wrapper class that would do the iteration for you, or keep a separate table with the indexes of each entry, if the performance decrease is acceptable for your use case.Set 通常不可能返回索引,因为它不一定针对特定 Set 实现进行良好定义。例如,它在 HashSet 文档中说
因此,当您实际期望的是实现某种顺序的 Set 时,您不应该说类型是 Set。
It is generally not possible for a Set to return the index because it's not necessarily well defined for the particular Set implementation. For example it says in the HashSet documentation
So you shouldn't say the type is Set when what you actually expect is a Set implementing som order.
虽然对于机器来说效率不高,但这可以通过一行实现:
Although not as efficient for the machine, this achieves it in one line:
我修改了mjs的解决方案以适应
indexOf()
实现1:
实现2:
示例:
I modified the mjs's solution to accommodate
indexOf()
Implementation 1:
Implementation 2:
Example:
没有更好的方法,只有单行方法(它也使用了迭代器,但隐式地使用了迭代器):
A better way there is not, only a single lined one (which makes use of the iterator, too but implicitly):
您可以将集合转换为列表,然后可以执行任何索引操作。
示例:需要将列表裁剪为 5 项。
You can convert your Set to List then you can do any indexing operations.
Example: need to crop Set list to 5 items.