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”的主要内容,如果未能解决你的问题,请参考以下文章

Javascript按字母顺序排序并将所有双精度数移动到数组的末尾

java按字母顺序排序[重复]

按字母顺序排序列表

MySQL按X排序然后分组按Y然后按字母顺序排列

按字母顺序对列表中的名称进行排序?

如何按字母顺序对项目进行排序?