我有兴趣将以下代码变成更简洁的代码:
\n\n final String[] strings = {"a", "B", "A", "\xc3\xa1", "\xc3\x81"};\n final Collator collator = Collator.getInstance(Locale.FRANCE);\n collator.setStrength(Collator.PRIMARY);\n\n final Map<String, Set<String>> m = new TreeMap<>(collator);\n for (String s : strings) {\n m.compute(s, (k, v) -> {\n if (v == null)\n v = new TreeSet<String>();\n v.add(s);\n return v;\n });\n }\n\n final Collection<Set<String>> requiredResult = m.values();\n\n requiredResult.forEach(System.out::println);\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n[A, a, \xc3\x81, \xc3\xa1]\n[B]\nRun Code Online (Sandbox Code Playgroud)\n\n基本上,它的作用是通过忽略大小写和变音标记来将字母视为相等,并将这些“相等”字母分组在一起。(顺便说一句,我知道大多数语言如果变音符号不同,则不认为字母相等;这只是一个人为的示例。)
\n\n我正在考虑通过使用流来缩短它。然而,groupingBy收集器要求将事物按字母分组。我这里没有具体的字母,只有一个Comparator(整理者)。
也许这样:
\n\nfinal String[] strings = {"a", "B", "A", "\xc3\xa1", "\xc3\x81"};\nfinal Collator collator = Collator.getInstance(Locale.FRANCE);\ncollator.setStrength(Collator.PRIMARY);\n\nCollection<Set<String>> result = Arrays.stream(strings)\n .collect(Collectors.groupingBy(collator::getCollationKey, Collectors.toSet()))\n .values();\nSystem.out.println(result); //[[a, A, \xc3\xa1, \xc3\x81], [B]]\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2730 次 |
| 最近记录: |