2016-04-16 3 views
1

Если у меня есть ArrayList как следующее:Сортировка списка массив, содержащий строки и целые числа

["a 100", "b 32", "t 54", "u 1"] (цифры и буквы разделены пробелом в каждой ячейке списка массива).

Как я могу отсортировать его по номерам, сохраняя каждый номер с соответствующей буквой ?.

+4

показать нам, что вы пробовали? – Maljam

+1

Что вы пытаетесь достичь? Первичный поиск по части строки и второстепенной по целочисленной части? – Mureinik

+1

Google 'java comparator'. Таким образом, вы можете отсортировать список по некоторому настраиваемому свойству или определению порядка. –

ответ

1

Вы можете просто использовать метод подкачки, как в обычных массивах. Единственное различие заключается в том, что мы используем метод set(index, "value") для обновления определенной строки по указанному индексу.

public static void sort (ArrayList<String> arr){  

    int N = arr.size(); 
    int E = N-1; 
    String temp; 
    boolean flag = true; 

    while(flag){ 
     flag=false; 

     for(int a = 0 ; a < E ; a++){ 
      if(Integer.parseInt(arr.get(a).substring(arr.get(a).indexOf(" ")+1)) > 
       Integer.parseInt(arr.get(a+1).substring(arr.get(a+1).indexOf(" ")+1))) { 

       temp=arr.get(a); 
       arr.set(a, arr.get(a+1)); 
       arr.set(a+1, temp); 

       flag=true; 
      } 
     } 
     E--;  
    }} 

Алгоритм сортировки - это сортировка пузырьков. Я использовал его из-за простоты. Вы можете использовать любой другой алгоритм сортировки, если хотите.

Затем, вы можете вызвать функцию sort() в основном методе:

public static void main(String[] args) { 

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

    arr.add("a 98"); 
    arr.add("a 23"); 
    arr.add("c 11"); 

    sort(arr); 
} 
+0

блестящий хорошо сделано –

+0

Вау, это медленно. –

1

Используйте специальный компаратор для сортировки списка.

List<String> yourList = Arrays.asList("a 100", "b 32", "t 54", "u 1"); 
yourList.sort((entry1, entry2) -> { 
    int number1 = Integer.parseInt(entry1.split(" ")[1]); 
    int number2 = Integer.parseInt(entry2.split(" ")[1]); 

    return Integer.compare(number1, number2); 
}); 

С уважением

+0

Не используйте 'return number1 - number2;' Используйте 'return Integer.compare (number1, number2)'. Попытайтесь подумать, что может случиться, если оба числа будут довольно большими и отрицательными. – Pshemo

+0

Спасибо @Pshemo, добавили его –

1
import static java.lang.Integer.*; 

Просто импортировать статические методы Integer и вы получите самый компактный Comparator<String> для вашей цели.

(a, b) -> compare(valueOf(a.split(" ")[1]), valueOf(b.split(" ")[1])); 
+1

Операторы импорта, заканчивающиеся на '*', являются плохой практикой. Лучше использовать 'import static java.lang.Integer.valueOf;' вместо этого. – VGR

+0

@VGR, да, я знаю это, но любовь к самым коротким ответам убьет меня :) Кстати, здесь у нас должно быть 2 статических импорта для методов 'compare' и' valueOf'. – Andrew

3

Похоже, вы пытаетесь реализовать объектно-ориентированное программирование с использованием строк. К счастью, Java уже это сделала.

Таким образом, сделать что-то вроде этого, вместо:

public class MyClass implements Comparable<MyClass> { 
    private final String aString; //could be char perhaps.. 
    private final Integer anInteger; 

    public MyClass(final String aString, final Integer anInteger) { 
     this.aString = aString; 
     this.anInteger = anInteger; 
    } 

    public String getAString() { return aString; } 
    public Integer getAnInteger() { return anInteger; } 

    public String toString() { return anInteger + " " + aString } 

    //comparison by number 
    public int compareTo(final MyClass other) { 
     return anInteger.compareTo(other.anInteger); 
    } 
} 

Затем вы используете это так:

final List<MyClass> myClasses = new ArrayList<>(); 
myClasses.add(new MyClass("a", 100)); 
myClasses.add(new MyClass("b", 32)); 
myClasses.add(new MyClass("t", 54)); 
myClasses.add(new MyClass("u", 1)); 

Collections.sort(myClasses); 
1

Предполагая, что элементы в списке по той же схеме:

затем вы можете сделать:

public static void main(String[] args) { 
    // ["a 100", "b 32", "t 54", "u 1"] 
    List<String> myList = new ArrayList<>(); 
    myList.add("a 100"); 
    myList.add("b 32"); 
    myList.add("t 54"); 
    myList.add("u 1"); 
    System.out.println("List unsorted" + myList); 
    Collections.sort(myList, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      try { 
       int a1 = Integer.parseInt(o1.substring(2)); 
       int a2 = Integer.parseInt(o2.substring(2)); 
       return Integer.compare(a1,a2); 
      } catch (NumberFormatException ex) { 
       return 0; 
      } 
     } 
    }); 
    System.out.println("List sorted" + myList); 
} 
Смежные вопросы