Java按字母顺序排序列表,末尾有值“Other”
Posted
技术标签:
【中文标题】Java按字母顺序排序列表,末尾有值“Other”【英文标题】:Java sort list alphabeticaly with value "Other" at the end 【发布时间】:2019-05-05 14:59:09 【问题描述】:我有一个小型 Spring Boot 应用程序,用于管理一些项目和客户端。 客户有一个国家(这是一个实体),我想让用户在他想要创建/更新他的客户时从 UI 中的预定义国家选项列表中进行选择。 如果国家/地区不在列表中,用户应选择“其他”,直到管理员添加新国家/地区。 唯一的问题是这个“其他”值必须始终位于选择列表的末尾,而其余国家/地区应按字母顺序排序。如果我按字母顺序对列表进行排序,则值“其他”将位于中间的某个位置。 我怎样才能有效地做到这一点(Java 和 DB)? 我现在正在为国家/地区使用 JPA 存储库 findAll。 第一个想法是为每个国家/地区添加一个索引,然后将“其他”设置为一个大值,因此我将按索引排序。但是如果插入完成......我不知道如何更新其他值。
编辑: Jens Schauder 解决方案奏效了!
【问题讨论】:
您可以编写自己的Comparator
,它明确检查“Other”并始终返回大于任何其他值的值。一旦您尝试过并遇到问题,请随时提出问题。
只是想知道,将 others 添加到排序数据中是不是很糟糕?
带着一个想法,但我不确定它是否有效,因为我对 mysql 不太好:如果我保留索引,所有国家的值都为 1,而“其他”的值为 0。然后,查询将是:按名称排序 asc 按索引顺序排序
这个怎么样? select * from country where name <> 'others' order by name union select * from country where name = others'
,这里country
是表名
【参考方案1】:
添加一个排序列,我现在称之为sortorder
。默认填写0
,对于特殊的“其他”国家/地区填写999
。
然后按sortorder
和国家名称订购。
【讨论】:
正如 Goibniu 所说,插入完成后将无法有效工作 @Goibniu 不正确。建议只是将列设置为0
,除了将设置为999
的“其他”之外的每个值,并将该列用作二级排序。您可以在触发器中将“其他”的值设置为 999
。
@TufisiRadu 为什么?插入的哪一部分使这变得复杂?当值不是“Other”时插入0
,当值是时插入999
。你甚至可以用触发器来做到这一点。
@BoristheSpider 你是对的。我设法做到了。非常感谢 Jens Schauder
@JensSchauder 我支持你,因为我看到你的解决方案有效,但是:谢谢你的反馈!未满 15 岁的人的投票会被记录,但不会更改公开显示的帖子分数【参考方案2】:
我建议您将isOther
字段添加到您的实体/表中,并按两个字段/列排序isOther
然后name
。
【讨论】:
Jens Schauder 上面提到过!无论如何,谢谢!【参考方案3】:您可以按排序顺序读取数据库并使用union
将其他添加到结果集中,如果其他人也出现在表中:
select * from country where name <> 'others' order by name
union
select * from country where name = 'others'
如果其他人不出现在表格中,您想手动添加(mysql
)
select * from country order by name
union
select 'others';
如果您在java
中进行操作,为什么不将others 添加到您的list
最后,假设从sorted
的表中读取数据顺序。
希望对你有帮助
【讨论】:
【参考方案4】:从列表中删除“其他”(如果默认列表包含“其他”) 如果需要,对列表进行排序(如果从数据库中获取可以避免) 排序) 在列表末尾添加“其他”Java方式
假设它是一个简单的基于字符串的 Arraylist
数据库方式
Select countryname from countryTable order by countryname union select other from dual
请注意语法和方法会根据您选择的数据库而有所不同,但抽象概念保持不变
【讨论】:
似乎没有必要——尤其是因为从ArrayList
中删除项目将是每个项目O(n)
。编写自定义 Comparator
会更简单、更高效。
我知道 Java 会处理这个问题,但效率不是很高。我知道您应该始终只从数据库中获取必要的数据,并让 SQL Server 来完成。
这个答案难以辨认 - 请了解formatting markdown。虽然答案还不错,但缺乏可读性可能会吸引反对票。花点时间让答案看起来不错 - 格式化项目符号、格式化代码等
@TufisiRadu 嗯?到底是什么让你这么想?
@BoristheSpider 我只是想指出,只要它是数据库解决方案,最好这样做而不是 Java。如果 MySQL 可以为我带来我需要的结果,我为什么要使用 Java?我错了吗?这是我在这里问的第一个原因【参考方案5】:
我有一个职业列表,包括“其他”。我使用 Comparator 解决了这个问题。
此解决方案适用于升序。如果需要,将“1”替换为“-1”以降序排列。
private static final String OTHER_PROFESSION_FIELD_NAME = "Other";
private static final Locale LOCALE = new Locale("tr", "TR"); //Locale
public Comparator<Profession> compareProfessionList()
Collator collator = Collator.getInstance(LOCALE);
return (o1, o2) ->
if (o1.getProfession().equals(OTHER_PROFESSION_FIELD_NAME))
return 1;
if (o2.getProfession().equals(OTHER_PROFESSION_FIELD_NAME))
return -1;
return collator.compare(o1.getProfession(), o2.getProfession());
;
【讨论】:
以上是关于Java按字母顺序排序列表,末尾有值“Other”的主要内容,如果未能解决你的问题,请参考以下文章