我有一个按字母顺序排序的数组列表,我必须使用 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
对于组的第一个字符( A
, F
, K
, P
, U
),或其他一些类,例如一个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/