java - 使用java将已排序的数据分成组(从A到E,从F到J....)

标签 java sorting java-8

我有一个按字母顺序排序的数组列表,我必须使用 Java 将其分成 5 组 - 集合 1 包含 A 和 E 之间的单词列表 - 集合 2 包含 F 和 J 之间的单词列表 - 集合 3 包含 K 和 O 之间的单词列表 - 集合 4 包含 P 和 T 之间的单词列表 - 设置 5 包含 U 和 Z 之间的单词列表

有人可以告诉我一种有效的方法吗?我正在使用 Java 8。

谢谢, 图沙尔

最佳答案

如果您从一个排序列表开始,其中所有元素都保证以简单的大写字母(即 A-Z)开头,那么最性能效率的方法是使用 binarySearch() subList() .

性能为 binarySearch()O(log n) .

List<String> list = Arrays.asList("Actually", "Chalk", "Dramatic", "Fence", "Horrible", "Labored",
                                  "Resonant", "Six", "Slap", "Spark", "Tin", "Treatment");
int idxF = Collections.binarySearch(list, "F");
int idxK = Collections.binarySearch(list, "K");
int idxP = Collections.binarySearch(list, "P");
int idxU = Collections.binarySearch(list, "U");
if (idxF < 0) idxF = ~idxF;
if (idxK < 0) idxK = ~idxK;
if (idxP < 0) idxP = ~idxP;
if (idxU < 0) idxU = ~idxU;
List<String> listA_E = list.subList(0, idxF);
List<String> listF_J = list.subList(idxF, idxK);
List<String> listK_O = list.subList(idxK, idxP);
List<String> listP_T = list.subList(idxP, idxU);
List<String> listU_Z = list.subList(idxU, list.size());
System.out.println(listA_E);
System.out.println(listF_J);
System.out.println(listK_O);
System.out.println(listP_T);
System.out.println(listU_Z);

输出

[Actually, Chalk, Dramatic]
[Fence, Horrible]
[Labored]
[Resonant, Six, Slap, Spark, Tin, Treatment]
[]
<小时/>

如果您从未排序的列表开始,最有效的方法是创建一个 Map<Group, List<String>>哪里Group是代表该组的唯一值。它可以是一个简单的 Character对于组的第一个字符( AFKPU ),或其他一些类,例如一个enum .

TreeMap 的性能为 O(n log n)/ TreeSet 建筑。

enum LetterGroup {
    A_E, F_J, K_O, P_T, U_Z;
    public static LetterGroup of(String s) {
        char ch = Character.toUpperCase(s.charAt(0));
        if (ch >= 'A' && ch <= 'E') return A_E;
        if (ch >= 'F' && ch <= 'J') return F_J;
        if (ch >= 'K' && ch <= 'O') return K_O;
        if (ch >= 'P' && ch <= 'T') return P_T;
        if (ch >= 'U' && ch <= 'Z') return U_Z;
        throw new IllegalArgumentException(s);
    }
}

有了这样的枚举,您就可以使用 Java 8 Streams 来完成它。

List<String> list = Arrays.asList("dramatic","slap","chalk","fence","resonant","tin",
                                  "six","labored","spark","treatment","horrible","actually");
Map<LetterGroup, Set<String>> groups = list.stream()
                                           .collect(Collectors.groupingBy(LetterGroup::of,
                                                                          TreeMap::new,
                                                                          Collectors.toCollection(TreeSet::new)));
for (Entry<LetterGroup, Set<String>> entry : groups.entrySet())
    System.out.println(entry);

输出

A_E=[actually, chalk, dramatic]
F_J=[fence, horrible]
K_O=[labored]
P_T=[resonant, six, slap, spark, tin, treatment]

关于java - 使用java将已排序的数据分成组(从A到E,从F到J....),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561237/

相关文章:

java - 在javascript中传递当前系统时间

java - 如何知道.jar文件目录

Javascript:按三个值对对象数组进行排序

java - 在哪些情况下,JpaRepository 会自动创建查询,而无需使用 @Query 注释

java - 将一组常量字符串(键)与 Map 进行比较的最佳方法

java - "Partially"POJO排序列表

c++ - 对我构建的类使用 STL sort() func

java - 使用 Streams API 收集器平均 BigDecimals

java - 使用java 8中的函数式接口(interface)根据数据类型将数据保存到不同的表中

javascript - 使用 Nashorn 将 Javascript 函数作为功能接口(interface)类型传递给 Java 方法