У меня есть запрос. В моей программе Java у меня есть список строк, но мне нужно знать, как их сортировать по Integer, содержащемуся в строках.
Например:
ArrayList<String> list = new ArrayList<String>();
И в этом списке:
"PersonOne - 1234 seconds";
"PersonTwo - 5678 seconds";
Мне нужно отсортировать его по номерам в каждой из строк. (В списке будет больше предметов).
Поскольку у вас есть строки в списке, вы можете написать собственный компаратор для этого. В компараторе вам нужно извлечь номер. Для этого вы можете разделить на -
а затем расщепление на пробел.
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("PersonTwo - 5678 seconds");
list.add("PersonOne - 1234 seconds");
list.add("PersonOnedf - 34 seconds");
System.out.println("Initial : " + list);
Collections.sort(list, new Comparator<Object>() {
@Override
public int compare(Object arg0, Object arg1) {
String s1 = (String)arg0;
String s2 = (String)arg1;
Integer n1 = Integer.parseInt(s1.split("-")[1].trim().split(" ")[0]);
Integer n2 = Integer.parseInt(s2.split("-")[1].trim().split(" ")[0]);
return (n1 < n2 ? -1 : 1);
}
});
System.out.println("Sorted : " + list);
}
Initial : [PersonTwo - 5678 seconds, PersonOne - 1234 seconds, PersonOnedf - 34 seconds]
Sorted : [PersonOnedf - 34 seconds, PersonOne - 1234 seconds, PersonTwo - 5678 seconds]
Начните с преобразования этих строк в структурированные объекты (например, Score
), содержащие имя (String
) и количество секунд (int
). Затем сортируйте эти объекты по их количеству секунд.
Разбор строки должен быть довольно простым: вам просто нужно найти индекс первой тире и индекс первого пробела после тире. Строка javadoc должна помочь вам найти, как искать символы в строке и как извлекать подстроки.
Обратите внимание, что если эти строки не поступают из какого-либо файла или внешнего ресурса, который вы должны проанализировать, вам не следует разбирать их в первую очередь. Используйте объекты "Оценка" с самого начала и преобразуйте их только как "Строки", когда вам нужно их распечатать.
Используйте собственный компаратор:
Collections.sort(list, new Comparator<String> () {
public int compare(String a, String b) {
return Integer.compare(Integer.parseInt(a.replaceAll("\\D", "")), Integer.parseInt(b.replaceAll("\\D", "")));
}
});
Вы даже можете создать вспомогательный метод для очистки кода:
Collection.sort(list, new Comparator<String> () {
public int compare(String a, String b) {
return Integer.compare(parse(a), parse(b));
}
int parse(String s) {
return Integer.parseInt(s.replaceAll("\\D", ""));
}
});
Collections.sort()
Если ваш элемент ArrayList имеет тот же формат, что и PersonOne - 1234 seconds
вы можете взять целые числа как,
String str = "PersonOne - 1234 seconds";
int integer = Integer.ParseInt(str.split("\\s")[2]);
возьмите все целые числа в этом формате и отсортируйте их.
Я думаю, что ваш массив не должен быть просто массивом String
. В inseted вы можете создать класс, который содержит name
переменной буфера типа String
и time
типа Integer
. после этого вы можете создать массив объектов класса, который вы создали. Затем вы можете отсортировать список по времени в секунду.
класс будет выглядеть следующим образом: (ПРИМЕЧАНИЕ: кодировка не тестируется)
public class SomeClassName
{
private String name;
private Integer time;
// Constructors
public SomeClassName()
{
super();
}
public SomeClassName(String name, Integer time)
{
this.name=name;
this.time=time;
}
// create setter and getter methods
public void setName(String name)
{
this.name=name
}
public void setTime(Integer time)
{
this.time=time
}
public String getName()
{
return name;
}
public Integer getTime()
{
return time;
}
}
то вы можете создать массив этого класса следующим образом:
ArrayList<SomeClassName> list = new ArrayList<SomeClassName>();
list.add( new SomeClassName("PersonOne" ,1234) );
list.add( new SomeClassName("PersonTwo",5678) );
для сортировки ArrayList объектов, основанных на некотором атрибуте, который вы используете для использования пользовательского компактора. проверьте эту ссылку: Сортировка ArrayList пользовательских объектов по свойству