java - 使用 Collat​​or 对带重音符号的字符串进行排序

标签 java collections groovy collation

我正在尝试使用 Collat​​or 对 map 进行排序,显然它只适用于列表

我正在使用这个:

 import java.text.*

    Collator collator = Collator.getInstance()
    collator.setStrength(Collator.PRIMARY)
    def list = [
  [name:"áaa", title:"foo1"],
  [name:"zzz", title:"foo2"],
  [name:"éee", title:"foo3"],
  [name:"ába", title:"foo4"],
  [name:"aaa", title:"foo5"] 
]

    Collections.sort(list.name, collator);

    ​list.collect{it.name}​

它返回[áaa, zzz, éee, ába, aaa]

但它应该返回:[áaa, aaa,ába,éee, zzz]

我该如何修复它?我需要保留原始 map 。 也许我可以使用 Collat​​or 之外的其他类

谢谢!!

最佳答案

Collections.sort 修改列表 list.name,该列表是您即时创建且之前未存储的。它确实被排序了,但结果在之后就丢失了:

更新:添加排序而不丢失 map 结构。

import java.text.*

def collator = Collator.instance
collator.strength = Collator.PRIMARY

def list = [
  [name:"áaa"],
  [name:"zzz"],
  [name:"éee"],
  [name:"ába"],
  [name:"aaa"] 
]

listc = list*.name

Collections.sort(listc, collator)

assert listc == ['áaa', 'aaa', 'ába', 'éee', 'zzz']


// Sorting without losing the map structure. 

sortedList = list.sort(false) { a, b -> collator.compare a.name, b.name }

assert sortedList == [
  [name:"áaa"],
  [name:"aaa"],
  [name:"ába"],
  [name:"éee"],
  [name:"zzz"],
]

关于java - 使用 Collat​​or 对带重音符号的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25920414/

相关文章:

java - 我需要用 Java 从内心和侧面画一个三角形,想法?

java - 一个重定向/中间页面可用于多个链接和目的地

java - App Engine 上的连接池与 Cloud SQL

java - 如何在java中使用对象列表的列表?

java - 如何在 Java 中创建一个新列表

java - HttpEntity 在关闭后重置并抛出 java.net.SocketException

java - 具有索引和哈希访问的集合

java - 加载远程 Groovy 脚本

scala - Scala 中是否有 GroovyScriptEngine 和 GroovyClassLoader 之类的东西?

java - 在 Spock 中将 Lambda 函数定义为参数约束