Если начать с отсортированного списка, в котором все элементы гарантированно начать с простого прописной буквы (т.е. A-Z), когда наиболее производительность эффективной способ заключается в использовании binarySearch()
и subList()
.
Производительность O (log n) от binarySearch()
.
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
) или какой-либо другой класс, например. a enum
.
Производительность O (n log n) от TreeMap
/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]
Вы можете собрать только конвейер в одну коллекцию. Почему бы не сохранить в карте>? –
Можете ли вы предположить, что все слова капитализируются? – Kelvin