#java #file
Вопрос:
Прежде всего: Извините за мой уровень английского. Я стараюсь учиться лучше. Итак, моя проблема в следующем: у меня есть файл txt и данные в файле, подобном этому:
- Хворостовский 8(количество песен, точно не знаю, просто для примера) Россия.
- Чайковского 9(то же самое здесь) Россия.
Мне нужно отсортировать по количеству песен от самых больших до самых маленьких или от самых маленьких до самых больших(это не имеет значения). Что я сделал:
public void onMouseClick(MouseEvent mouseEvent) {
char separator = '.';
ArrayList<String> listOfLines = readFileInArray();
for(String s: listOfLines){
char maxValue = '0';
for(int i = 0; i < s.length(); i ){
if(s.charAt(i) == separator){
if(Character.getNumericValue(maxValue) < s.charAt(i 1)){
maxValue = s.charAt(i 1);
System.out.println(maxValue);
}
}
}
}
}
У меня есть ArrayList, содержащий данные из файла, и я понял, как найти количество песен в файле, но я не знаю, как их отсортировать.
Комментарии:
1. Почему вы разделяете на».», если ввод «Название 8 стран»?
2. @MostNeededRabbit Я забыл об этом. Я добавил символ».», который помогает мне найти количество песен. Вот так: Чайковский. 8 Россия. Я сделал цикл, в котором я могу проверить, равен ли символ». » затем я печатаю символ[i 1], и это всегда количество песен.
3. Поэтому я не понимаю, являются ли ваши данные, которые вы хотите отсортировать, данными Чайковского. 8 Россия или Чайковский 8 Россия или Чайковский. 8.Россия
4. это всегда однозначное число?
5. Это не имеет значения. Символ». » помогает мне найти количество песен. Я знаю, что могу разделить на «» в классе String, но для меня это будет намного сложнее.
Ответ №1:
Основываясь на описании входных данных, вы можете сделать:
List<String> lines = Arrays.asList("Chaikovsky.9 Russia", "Hvorostovsky.8 Russia", "OtherName.21 Russia");
List<String> sortedLines = lines.stream()
.sorted((s1, s2) -> {
int l1 = s1.indexOf('.') 1;
int l2 = s2.indexOf('.') 1;
int n1 = Integer.parseInt(s1.substring(l1, s1.indexOf(' ', l1)));
int n2 = Integer.parseInt(s2.substring(l2, s2.indexOf(' ', l2)));
return Integer.compare(n1, n2);
})
.collect(Collectors.toList());
Выход:
[Hvorostovsky.8 Russia, Chaikovsky.9 Russia, OtherName.21 Russia]
Комментарии:
1. Большое спасибо. Хорошего вам дня 🙂
2. еще раз привет 🙂 Как я могу сравнить такие данные, как строка, с вашим методом? Мне нужно отсортировать страны по алфавиту. Вот мой код: pastebin.com/LNnsKs6P Мои данные сейчас в файле: Чайковский.9-Россия
3. Список<Строка> Сортированные строки = строки.поток() .сортированный((s1, s2) -<Строка>> { int l1 = s1.Индекс(‘-‘) 1; int l2 = s2.Индекс(‘-‘) 1; возврат s1.подстрока(l1).Сопоставление(s2.подстрока(l2)); }) .сбор(Сборщики. тоЛист());
4. @Staaankey см. мой комментарий выше ^^
5. получите ошибку в строке возврата с сообщением «статический метод может быть вызван только для содержащего класса интерфейса». Извините, если я вас беспокою.