2016-10-17 8 views
0

私は文字列のアルファベット順をソートするこのプログラムを書いています。私は数字の文字列の別の部分でそれを並べ替えることができるようにしたい。 (私も日食を使用しています)。ここで は私が持っているものである:出力の場合文字列の配列を文字列またはインデックスの一部で並べ替えますか?

import edu.princeton.cs.algs4.Merge; 

public class sortNum { 

    public static void main(String[] args) { 
    // TODO Auto-generated method 

    String[] age = {"Meredith Chicago #82", 
      "Brian Phoenix #45", "Jess Miami #26", 
      "Gunther NYC#53", "Frank Boise #4"}; 

    System.out.println("-----------------------------"); 

    //loop through array and print out unsorted string 

    for(String i : age){ 
     System.out.printf("%25s\n", i); //to right-align 

    } 

    System.out.println("-----------------------------"); 

    Merge.sort(age); 

    //loop through array and print sorted string 

    for(String j: age){ 
     System.out.println(j); //this is where I am unsure of the right way 
    } 



    System.out.println("-----------------------------"); 
    } 

} 

、私はこれを取得:

----------------------------- 
    Meredith Chicago #82 
     Brian Phoenix #45 
      Jess Miami #26 
      Gunther NYC#53 
      Frank Boise #4 
----------------------------- 
Brian Phoenix #45 
Frank Boise #4 
Gunther NYC#53 
Jess Miami #26 
Meredith Chicago #82 
----------------------------- 

をそして明らかにこの文字列の先頭を見ていることによるものです。これは問題ではなく、当然のことです。

数値を表示する場所に設定できますか?インデックスを数えることでこれを行うことはできますか?たとえば、末尾の数字(-1)から#までを数えますが、これをソートして並べ替えます。もちろん昇順。私はまだforループを使用しようとしています。

私はループなしで、情報ごとに別々のオブジェクトを作成していましたが、これが永遠にかかり、コードが多すぎることに気付きました。

+0

'Merge'は何ですか?それはどこに定義されていますか? Javaライブラリのソート方法を使用している場合は、好きなようにソートするためのカスタム 'Comparator'実装を提供できますが、使用しているクラスで可能かどうかは分かりません。 –

+0

はい、文字列の数値部分で配列を並べ替えることができます。文字列を正しく分割し、数値を抽出し、intに変換して並べ替えます。おそらくそれを行う他の方法があります。あなたの質問に答えますか?あるいは、コードを提供することで誰かにそのことを示す方法を教えてもらいたいですか? – Nurjan

+0

@JimGarrison私は、 'Merge'を含むhttp://algs4.cs.princeton.edu/code/のalgs4.jarを使用しています。また、ここでは 'merge'の定義をhttp://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/Merge.java.htmlとしています。 周囲の読書から、私はそれが可能かもしれないと思う。私はJava初心者のように実装する方法がわかりません。 – adhamncheese

答えて

3

私はこのようなデータのこのタイプのために別のオブジェクトを作成することをアドバイスします:

public class User implements Comparable<User> { 
    private int mId; 
    private String mName; 

    public User(final int id, final String name) { 
    mId = id; 
    mString = name; 
    } 

    public String getName() { 
    return mName; 
    } 

    @Override 
    public int compare(final User lhs, final User rhs) { 
    return Integer.compare(lhs.mId, rhs.mId); 
    } 

    @Override 
    public String toString() { 
    return String.format("%s #%d", mName, mId); 
    } 
} 

ここで私はあなたが好きなあなたは、比較タイプを上書きすることができComparable<User>を実装しました。ここで私は単純にIDのユーザーを比較します。 その後、Collections.sort(List<User>)またはMerge.sort(Comparable[])を使用してソートすることができます。また、toString()メソッドをオーバーライドすると、簡単にuser.toString()というようにユーザー情報を出力することができます。

+0

'((Integer)lhs.mId).compareTo(rhs.mId)'は['Integer.compare(lhs.mId、rhs.mId)']でなければなりません。(https://docs.oracle.com/javase/8 /docs/api/java/lang/Integer.html#compare-int-int-)。それらを比較するために整数だけをオートボックスしないでください。 – Andreas

+0

@アンドレアスはアドバイスをありがとう!私は今答えを編集します。私はAndroidプログラマなので、私たちはネイティブの 'Integer.compare(int、int)'を持っていないので、私はそのように示しています:) – IlyaGulya

1

Arrays.sortを使用して配列をソートし、それにカスタムコンパレータを付けることができます。たとえば、Java 8を使用する場合:

Arrays.sort(age, Comparator.comparingInt(a -> Integer.parseInt(a.split("#")[1]))); 

このコードは機能しますが、ロジックをカプセル化するクラスを作成することをお勧めします。

public class Person { 
    public static Person decode(String line) { 
     Matcher matcher = Pattern.compile("(\\w+) #(\\d+)").matcher(line); 
     if (!matcher.matches()) 
      throw new IllegalArgumentException("Illegal format"); 
     return new Person(matcher.group(1), matcher.group(2)); 
    } 

    public int getAge() {...} 
    public String getName() {...} 
} 

次に、あなたのコードがはるかに明示的になることができますストリームを使用して:

Arrays.stream(age) 
    .map(Person::decode) 
    .sorted(Comparator.comparingInt(Person::getAge)) 
    .forEach(...); 
関連する問題