Как бы я отсортировал список строк по целым числам в этой строке? *Ява*

1

У меня есть запрос. В моей программе Java у меня есть список строк, но мне нужно знать, как их сортировать по Integer, содержащемуся в строках.

Например:

ArrayList<String> list = new ArrayList<String>();

И в этом списке:

"PersonOne - 1234 seconds";
"PersonTwo - 5678 seconds";

Мне нужно отсортировать его по номерам в каждой из строк. (В списке будет больше предметов).

  • 0
    Если вам комфортно в UNIX или Linux или в OS X Terminal, вы можете захотеть увидеть, что команда «sort -k3 -n» делает то, что вы предлагаете.
Теги:

5 ответов

1
Лучший ответ

Поскольку у вас есть строки в списке, вы можете написать собственный компаратор для этого. В компараторе вам нужно извлечь номер. Для этого вы можете разделить на - а затем расщепление на пробел.

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]
  • 0
    Просто как быстрый вопрос, что делать ? и : значит / делать?
  • 1
    @ Gokarting54 stackoverflow.com/questions/798545/…
Показать ещё 1 комментарий
4

Начните с преобразования этих строк в структурированные объекты (например, Score), содержащие имя (String) и количество секунд (int). Затем сортируйте эти объекты по их количеству секунд.

Разбор строки должен быть довольно простым: вам просто нужно найти индекс первой тире и индекс первого пробела после тире. Строка javadoc должна помочь вам найти, как искать символы в строке и как извлекать подстроки.

Обратите внимание, что если эти строки не поступают из какого-либо файла или внешнего ресурса, который вы должны проанализировать, вам не следует разбирать их в первую очередь. Используйте объекты "Оценка" с самого начала и преобразуйте их только как "Строки", когда вам нужно их распечатать.

  • 0
    Аааа, но первый пробел идет сразу после тире, так как мне получить второй пробел?
  • 3
    Почему отрицательный голос? Это совершенно правильно, хотел написать тоже самое ... +1 от меня
Показать ещё 2 комментария
3

Используйте собственный компаратор:

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", ""));
    }
});
  • 1
    Это должен быть Collections.sort()
  • 0
    @Braj именно так. У большого кода на iPhone есть свои проблемы.
Показать ещё 1 комментарий
1

Если ваш элемент ArrayList имеет тот же формат, что и PersonOne - 1234 seconds вы можете взять целые числа как,

String str = "PersonOne - 1234 seconds";
int integer = Integer.ParseInt(str.split("\\s")[2]);

возьмите все целые числа в этом формате и отсортируйте их.

  • 0
    Так "\\ s" получает все буквы?
  • 0
    Но как мне тогда отсортировать список по этим целым числам?
Показать ещё 1 комментарий
0

Я думаю, что ваш массив не должен быть просто массивом 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 пользовательских объектов по свойству

Ещё вопросы

Сообщество Overcoder
Наверх
Меню