14742


このリストをs1で文字列でソートしたいのですが標準のソートを適用するのは難しい  
しかし、一から文字列のソートを書くのはコードが大変そうです  
s1とs2は紐づけしたまま扱いたい何かいい案はありませんか？

[code]

    public class MultiList {
        public class String2{
            private String s1;
            private String s2;
    
            public void setString1(String text1) {
                s1 = text1;
            }
            public void setString2(String text2) {
                s2 = text2;
            }
    
            public String getString1() {
                return s1;
            }
            public String getString2() {
                return s2;
            }
        }
    
    
    
        public ArrayList<String2> String2List(ArrayList<String> s1, ArrayList<String> s2){
            //二つのリストからオブジェクト型のリストを返す
            ArrayList<String2> String2List = new ArrayList<String2>();
            if(s1.size() == s2.size()){
                for(int i = 0; i<s1.size();i++){
                    String2 String2 = new String2();
                    String2.setString1(s1.get(i));
                    String2.setString2(s2.get(i));
                }
                return String2List;
            }
            return String2List;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-08-22T18:15:50.357
14741
2015-08-23T05:34:51.823
2015-08-22T18:19:24.480
10814
10814
question
java arraylist
複数の文字列を格納したArrayListのソート


標準のソートじゃないなら、[`java.util.Collections.sort(list,
comparator)`](https://docs.oracle.com/javase/jp/7/api/java/util/Collections.html#sort\(java.util.List,%20java.util.Comparator\))使ってみて。例:

[code]

    ArrayList<String2> merged = String2List(list_1, list_2);
    java.util.Collections.sort(merged, new java.util.Comparator<String2>(){
            public int compare(String2 a, String2 b) {
            return a.getString1().compareTo(b.getString1());
        }
    });
    
[/code]

完全な例:

[code]

    import java.util.ArrayList;
    
    public class MultiList {
        public static void main(String args[]){
            ArrayList<String> list_1 = new ArrayList<String>();
            java.util.Collections.addAll(list_1, "c", "b", "a");
            ArrayList<String> list_2 = new ArrayList<String>();
            java.util.Collections.addAll(list_2, "Tom", "Peter", "Harry");
    
            ArrayList<String2> merged = String2List(list_1, list_2);
            java.util.Collections.sort(merged, new java.util.Comparator<String2>(){
                  public int compare(String2 a, String2 b) {
                     return a.getString1().compareTo(b.getString1());
                }
            });
    
            for(String2 s:merged){
                System.out.println(s.getString1() + ", " + s.getString2());
            }
        }
    
        public static ArrayList<String2> String2List(ArrayList<String> s1, ArrayList<String> s2){
            ArrayList<String2> String2List = new ArrayList<String2>();
            if(s1.size() == s2.size()){
                for(int i = 0; i<s1.size();i++){
                    String2 String2 = new String2();
                    String2.setString1(s1.get(i));
                    String2.setString2(s2.get(i));
                    String2List.add(String2); // 注意
                }
            }
            return String2List;
        }
    
        public static class String2{
            private String s1;
            private String s2;
    
            public void setString1(String text1) {
                s1 = text1;
            }
            public void setString2(String text2) {
                s2 = text2;
            }
    
            public String getString1() {
                return s1;
            }
            public String getString2() {
                return s2;
            }
        }
    }
    
[/code]

その出力:

[code]

    a, Harry
    b, Peter
    c, Tom
    
[/code]


CC BY-SA 3.0
2015-08-23T00:48:37.613
14742
2015-08-23T00:48:37.613
4022
14741
answer


Java8であれば[ラムダ式](http://www.atmarkit.co.jp/ait/articles/1403/17/news105.html)で下記のように書けます。

[code]

    String2List.sort((lhs, rhs) -> lhs.getString1().compareTo(rhs.getString1()));
    
[/code]

メソッド`String2List`でリスト`String2List`をソートして返したい場合は下記のようになります。

[code]

    public ArrayList<String2> String2List(ArrayList<String> s1, ArrayList<String> s2){
        //二つのリストからオブジェクト型のリストを返す
        ArrayList<String2> String2List = new ArrayList<String2>();
        if(s1.size() == s2.size()){
            for(int i = 0; i<s1.size();i++){
                String2 String2 = new String2();
                String2.setString1(s1.get(i));
                String2.setString2(s2.get(i));
    
                String2List.add(String2); // 追加
            }
    
            // ソート(Java8)
            String2List.sort((lhs, rhs) -> lhs.getString1().compareTo(rhs.getString1()));
    
            return String2List;
        }
        return String2List;
    }
    
[/code]


CC BY-SA 3.0
2015-08-23T04:43:14.767
14749
2015-08-23T04:43:14.767
4765
14741
answer


テクいことやるより、`Comparable`を実装して標準のソートを使うのが一番早いと思います。

[code]

    // 複数のリストではなく、複数の文字列なのでクラス名変更
    public class MultiString implements Comparable<MultiString>{
    
        final private String s1;
        final private String s2;
    
        public MultiString(final String s1, final String s2) {
            this.s1 = s1;
            this.s2 = s2;
        }
    
        @Override
        public int compareTo(MultiString o) {       
            int result = this.s1.compareTo(o.s1);
            return result == 0 ? this.s2.compareTo(o.s2) : result;
        }
    
        @Override
        public String toString() {
            return "{s1:"+this.s1+", s2:"+this.s2+"}";
        }
    }
    
[/code]

という感じでs1の順序で比較後、s2の順序で比較する`Comparable`を実装して、

[code]

    public class Main {
    
        public static void main(String[] args) {
            @SuppressWarnings("serial")
            List<MultiString> aList = new ArrayList<MultiString>(){{
                add(new MultiString("a", "a")); add(new MultiString("a", "b")); add(new MultiString("a", "c")); 
                add(new MultiString("b", "a")); add(new MultiString("b", "b")); add(new MultiString("b", "c"));
                add(new MultiString("c", "a")); add(new MultiString("c", "b")); add(new MultiString("c", "c"));
            }};
    
            Collections.shuffle(aList);
            System.out.println(aList);
            Collections.sort(aList);
            System.out.println(aList);
        }
    }
    
[/code]

### 出力

> [{s1:b, s2:b}, {s1:b, s2:c}, {s1:c, s2:c}, {s1:a, s2:a}, {s1:c, s2:a},
> {s1:a, s2:b}, {s1:b, s2:a}, {s1:a, s2:c}, {s1:c, s2:b}]  
>  [{s1:a, s2:a}, {s1:a, s2:b}, {s1:a, s2:c}, {s1:b, s2:a}, {s1:b, s2:b},
> {s1:b, s2:c}, {s1:c, s2:a}, {s1:c, s2:b}, {s1:c, s2:c}]


CC BY-SA 3.0
2015-08-23T05:34:51.823
14750
2015-08-23T05:34:51.823
5337
14741
answer