2016-04-16 50 views
1

を含む配列リストを並べ替え:は、文字列と整数

["a 100", "b 32", "t 54", "u 1"](数字と文字が配列リストの各セルにスペースで区切られます)。

どのように対応する文字で各番号を保持する番号でそれを並べ替えることができますか?

+4

たちを表示:

その後、あなたはmainメソッドでsort()関数を呼び出すことができますか? – Maljam

+1

あなたは何を達成しようとしていますか?文字列部分と整数部分による2次検索の主な検索は? – Mureinik

+1

Google「Javaコンパイラ」。これは、カスタムプロパティまたはオーダーの定義によってリストをソートする方法です。 –

答えて

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--;  
    }} 

ソートアルゴリズムはバブルソートです。私はシンプルさのためにそれを使用しました。必要に応じて他のソートアルゴリズムを使用できます。あなたは試してみました何

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、はい、私は知っていますが、最短回答の愛が私を殺します:)ところで、ここでは、compareとvalueOfの2つの静的なインポートが必要です。 – 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); 
} 
関連する問題