列表排序难题
假设我有
final Iterable<String> unsorted = asList("FOO", "BAR", "PREFA", "ZOO", "PREFZ", "PREFOO");
什么可以将这个未排序的列表转换为:(
[PREFZ, PREFA, BAR, FOO, PREFOO, ZOO]
一个以必须首先出现的已知值开头的列表(此处为“PREFA”和“PREFZ”),其余部分按字母顺序排序)
我认为有一些有用的番石榴中的类可以完成这项工作(排序、谓词...),但我还没有找到解决方案...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我会保留单独的清单。
一种用于已知值和未知值。并将它们分开排序,当您需要将它们放在一个列表中时,您可以将它们连接起来。
I would keep separate lists.
One for known values and unknown values. And sort them separately, when you need them in a one list you can just concatenate them.
我建议填写 List 与您的值并使用 Collections.sort(...)。
像
这样使用:
I suggest filling List with your values and using Collections.sort(...).
Something like
using this:
注意:这不是最有效的解决方案。这只是一个简单、直接的解决方案,可以完成工作。
我首先使用 Collections.sort(list) 对列表进行排序。
然后,我会删除已知的项目,并将它们添加到前面。
或者,如果您在前面有需要的这些值的数组列表,您可以执行以下操作:
Note: This is not the most efficient solution. It is just a simple, straightforward solution that gets the job done.
I would first use
Collections.sort(list)
to sort the list.Then, I would remove the known items, and add them to the front.
Or, if you have a list of array of these values you need in the front you could do:
由于我是番石榴库的粉丝,我想找到一个使用它的解决方案。我不知道它是否有效,也不知道您是否发现它像其他解决方案一样简单,但它在这里:
Since I'm a fan of the guava lib, I wanted to find a solution using it. I don't know if it's efficient, neither if you find it as simple as others solution, but it's here:
你特别提到了番石榴;与 Sylvain M 的答案一起,这是另一种方法(更多的是作为学术练习和番石榴灵活性的演示)
因此,换句话说,对
List 返回的
,然后打破与对象本身的自然顺序的联系。Integer
的自然顺序进行排序.indexOf()也许很混乱,但很有趣。
You specifically mentioned guava; along with Sylvain M's answer, here's another way (more as an academic exercise and demonstration of guava's flexibility than anything else)
So, in other words, sort on natural order of the
Integer
returned byList.indexOf()
, then break ties with natural order of the object itself.Messy, perhaps, but fun.
我也会使用 Collections.sort(list) 但我想我会使用比较器,在比较器中您可以定义自己的规则,例如然后
通过执行以下操作进行排序:
I would also use
Collections.sort(list)
but I think I would use a Comparator and within the comparator you could define your own rules, e.g.Then sort by doing: