0

複数のデータ型を含む単一の文字列を並べ替える方法はありますか?

例: //int と words(strings) を含む文字列 String str1 = "1 one 2 two t"; 文字列 str2 = "1 2 3 2 t"; String str3 = "1 three 1 two t";

これらの 3 つの文字列内の 2 番目の int だけで並べ替えたいとしましょう。

javaに文字列の特定の部分だけを検索するように指示する方法はありますか?

したがって、私が望む出力は次のようなリストになります。

str3
str1
str2

or 

"1 three 1 two t"
"1 two 2 two t"
"1 one 3 two t"
4

4 に答える 4

1

単一の をソートするとはどういう意味Stringですか? 文字列をソートしたいグループに分割してから、それをソートする必要があります。classデータに特定の形式がある場合は、適切なフィールドに分割された要素を含む短く単純なものを作成する必要があります。

于 2013-02-04T18:00:44.323 に答える
0

質問を編集するまでは、質問で定義されているような文字列のリストがあると思います。

その場合、独自の Comparator を使用してこのようにすることができます。エラー チェックはありませんが、アイデアは次のようになります。

class CustomComparator implements Comparator<String> {
     public int compare(String s1, String s2) {
         String[] parts1 = s1.split(" ");
         String[] parts2 = s2.split(" ");
         Integer i1 = Integer.valueOf(parts1[2]);
         Integer i2 = Integer.valueOf(parts2[2]);
         return i1.compareTo(i2);
    }
}
Collections.sort(Arrays.asList("3 three 4 four", "1 one 2 two", "5 five 6 six"), new CustomComparator());
于 2013-02-04T18:07:12.000 に答える
0

必要に応じて文字列を比較する独自のコンパレータを作成します。このようなもの:

String [] values = new String [] {"foo 7 bar 3 foobar", "why 2 by 2 is 4?"};
Arrays.sort (values, new Comparator <String> ()
{
    @Override
    public int compare (String o1, String o2)
    {
        return extract2ndInt (o1).compareTo (extract2ndInt (o2));
    }

    private Integer extract2ndInt (String s)
    {
        Matcher m = Pattern.compile ("\\d+").matcher (s);
        m.find ();
        m.find ();
        return Integer.parseInt (m.group ());
    }
});
System.out.println (values [0]);
System.out.println (values [1]);
于 2013-02-04T18:07:37.067 に答える
0

これを行う方法はいくつか考えられます。

適切な方法

ステップ 1 - 文字列の使用をやめる。あなた自身の承認により、この文字列には「複数の変数タイプが含まれています」。これは文字列ではなく、クラスです (文字列は一連のchars です)。実際にそのように表現すると、この状況が簡単になる (そしてエラーが発生しにくくなる) だけでなく、それらを使用する必要がある他の場所でも同様の利益が得られます。

したがって、関連するデータ型をカプセル化するクラスを次のように定義します。

public class MyFoo {
    final int firstNum;
    final String firstDesc;
    final int secondNum;
    final String secondDesc;
    final boolean trueFalseBit;

    // Constructor, equals, hashcode etc. elided
}

str1次に、システムに渡されたような文字列を最初に取得するたびにMyFoo、トークン化、トークンの int への変換などにより、文字列形式に適したものに変換します。

具象型のさまざまなフィールドを持つ実際のクラスができたので、これらのフィールドの 1 つまたは複数による並べ替えについて適切に考えることができます。これを行うには 2 つの方法があります。

まず、この順序でソートするメソッドをクラスに実装Comparableして定義することができます。compareこれは、インスタンスの「自然な順序」である場合にのみ意味があります。ほとんどの状況でデフォルトの並べ替えとして意味のあるもの。

それ以外の場合は、 の独自のインスタンスを定義して、Comparator<MyFoo>好きな順序でオブジェクトを並べ替えることができます。上記の私のクラスを使用した例は次のようになります。

Comparator<MyFoo> cmp = new Comparator<MyFoo>() {
    public int compare(MyFoo a, MyFoo b) {
       return b.secondNum - a.secondNum;
    }
}

ハッキーな方法

Comparator<String>各文字列の「2 番目の int」を抽出するカスタムを記述し、それに応じて並べ替えるだけです。これは、これらの文字列をクラスに変換する場合に使用する解析コードに似ています。おそらく次のようなものです。

Comparator<String> cmp = new Comparator<String>() {
    private int getSecondInt(String s) {
        String[] parts = s.split(" ");
        // TODO check length is at least 3
        return Integer.parseInt(parts[2]);
        // TODO handle exceptions
    }

    public int compare(String a, String b) {
       return getSecondInt(b) - getSecondInt(a);
    }
}

この方法は、これらの文字列を 1 回だけ使用して並べ替えてから破棄する場合には、より理にかなっている可能性があります。そのため、完全なオブジェクトを構築するメリットはほとんどありません。

于 2013-02-04T18:09:51.133 に答える