Я пытаюсь сделать так, чтобы при задании строки имен, которые являются именами и фамилиями, где имена разделены на ;
, а имя разделено на фамилию на :
->
"Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill"
Я хочу вернуть строку, в которой все имена отсортированы в верхнем регистре и отсортированы в алфавитном порядке в соответствии с фамилией и теми, которые имеют одну и ту же фамилию, а затем снова отсортированы (вторичная сортировка) между именами людей, которые имеют одинаковые Фамилия. (Я также специально меняю все на ПРОПИСНЫЕ).
И вернуть строку отсортированных имен, поэтому для приведенного выше примера она должна возвращаться:
"(CORWILL, ALFRED)(CORWILL, FRED)(CORWILL, RAPHAEL)(CORWILL, WILFRED)(TORNBULL, BARNEY)(TORNBULL, BETTY)(TORNBULL, BJON)"
который сортирует по фамилии в алфавитном порядке, затем сортирует между теми, у кого одна и та же фамилия, вторичную сортировку по именам.
Мне удалось выполнить основную сортировку, то есть сортировку фамилий по алфавиту, но я не знаю, как выполнить вторичную сортировку (между теми, у кого одна и та же фамилия). Я думал разбить на подмассивы или что-то подобное, но я не уверен, как это сделать.
Каково решение для этого?
Вот что мне удалось до сих пор (работает на основной сортировке):
public class Solution {
public static String meeting(String s) {
String m = "";
List<String> name = new ArrayList<String>();
for (String i : s.toUpperCase().split(";")) {
String[] n = i.split(":");
name.add(n[0] + " " + n[1]);
}
//main sorting
java.util.Collections.sort(name);
//secondary sorting and go through each different last name
for (String i : name) {
String[] n = i.split(" ");
String lastname = n[1];
// new list for the ppl who share same last name
List<String> samel = new ArrayList<String>();
samel.add(n[0]);
for (String ss : name) {
String[] nn = ss.split(" ");
if (nn[1] == lastname) {
samel.add(nn[0]);
}
}
//sort the ppl alphabetically with the same last name
java.util.Collections.sort(samel);
}
for (String i : name) {
String[] n = i.split(" ");
m += ("(" + n[0] + " , " + n[1] + ")");
}
return m;
}
}
Я попытался сделать вторичную сортировку и не увенчался успехом.
Если я не был достаточно ясен, есть две сортировки: основная по фамилиям в алфавитном порядке и вторичная сортировка, которая происходит только для людей с одинаковой фамилией, тогда их имена сортируются соответственно по алфавиту. Итак, если у нас есть два человека по имени Мэтт Кон и Милл Кон, то у них одна и та же фамилия и одна и та же первая буква в фамилии, но а стоит перед о, поэтому вывод должен быть (COHN , MATT)(COHN, MILL)
, а не наоборот.
В решении внизу я запустил его и получил ошибку:
input String:
Alexis:Wahl;John:Bell;Victoria:Schwarz;Abba:Dorny;Grace:Meta;Ann:Arno;Madison:STAN;Alex:Cornwell;Lewis:Kern;Megan:Stan;Alex:Korn
Actual: (ARNO, ANN)(BELL, JOHN)(CORNWELL, ALEX)(DORNY, ABBA)(KERN, LEWIS)(KORN, ALEX)(META, GRACE)(STAN, MADISON)(SCHWARZ, VICTORIA)(STAN, MEGAN)(WAHL, ALEXIS)
Expect: (ARNO, ANN)(BELL, JOHN)(CORNWELL, ALEX)(DORNY, ABBA)(KERN, LEWIS)(KORN, ALEX)(META, GRACE)(SCHWARZ, VICTORIA)(STAN, MADISON)(STAN, MEGAN)(WAHL, ALEXIS)
false
но оказалось ложным
Person
, который будет хранить имя, фамилию и предоставит для них геттеры, затем создайте список объектов Person и заполните его объектамиPerson
, такими какpeople.add(new Person(n[0], n[1]));
). Тогда создание Comparator для метода сортировки будет проще. Например, вы можете написать что-то вродеpeople.sort(Comparator.comparing(Person::getSurname).thenComparing(Person::getName));
. - person Pshemo   schedule 04.01.2021nn[1]==lastname
используйтеnn[1].equals(lastname)
для сравнения строк. Кроме того, если вы не используете версию Java до 8,list.sort()
проще, чемCollections.sort(list)
. - person Andy Turner   schedule 04.01.2021Alfred:Corwil
должно бытьAlfred:Corwill
с двойнымll
в конце? - person YCF_L   schedule 04.01.2021MADISON
послеVICTORIA
? - person YCF_L   schedule 04.01.2021return Arrays.stream(s.split(";")) .map(p -> p.split(":")) .sorted(Comparator.comparing((String[] p) -> p[1]).thenComparing((String[] p) -> p[0])) .map(p -> String.format("(%s, %s)", p[1].toUpperCase(), p[0].toUpperCase())) .collect(Collectors.joining());
- person YCF_L   schedule 04.01.2021