5

次の配列を並べ替えるにはどうすればよいStringですか?

String[] s = {"0.1", "0.3", "0.6", "0.4", "0.5", "0.2", "0.7", "0.8", "0.9", "0.10"};

並べ替えとは、ここで整数に変換して結果を。として取得することを意味するものではありません0.9

ここでは、値をとして取得します0.10

この場合、文字列配列にが含まれている1.1と、最大値はになります1.1

配列がこのような場合、つまり、最大値を取得できます。

String[] s = {"0.1", "0.4", "0.3", "0.4", "0.5", "0.2", "0.7", "1.8", "2.9", "3.1"};

私のコードはこの文字列配列で機能しますが、

String[] s = {"0.1", "1.4", "1.3", "0.4", "0.5", "0.2", "2.7", "1.8", "2.9", "0.1"};

私のコード。

public String createNewVersion(
            String[] entityVersionHistory) {

Map<Integer, List<Integer>> m_Map1 = new HashMap<Integer, List<Integer>>();

String prevKey = "0";
String currentKey = null;

List<Integer> list = new ArrayList<Integer>();

for (String str: entityVersionHistory)
{
    String[] splitVersion = str.split("\\.");
    currentKey = splitVersion[0];
    if(!prevKey.equals(currentKey))
    {
        Integer s = new Integer(splitVersion[1]);

        m_Map1.put(Integer.valueOf(prevKey), list);
        list = new ArrayList<Integer>();
        list.add(s);

        prevKey = currentKey;
    }
    else
    {
        Integer s = new Integer(splitVersion[1]);
        list.add(s);
    }
}
m_Map1.put(Integer.valueOf(prevKey), list);

どうすればこれを達成できますか?

4

3 に答える 3

5

一般的に考えるほど簡単ではありません。などのバージョン番号もある3.1betaので。これらについて以下で完全に説明するのではなく、発生するいくつかの課題をスケッチするだけです。

ただし、基本的な考え方は次のとおりです。

  1. で文字列を配列に分割.し、個々のコンポーネントを整数に変換します。

  2. コンポーネントごとに比較します。最初のコンポーネントで2つの数値が一致する場合は、次のコンポーネントにスキップしてください。

したがって、バージョン番号3.10.1を指定3.9.2して、最初にそれらを整数の配列に変換します:{ 3, 10, 1 }および{3, 9, 2}。次に、最初のコンポーネントをテストしますが3 == 3、次のコンポーネントにスキップします。10 > 9、したがって、結果は最初の方が大きくなります。

今、あなたがサポートbetaしたいようなものをしたいのなら、それは本当に厄介になります。例としてDebianのバージョン番号を取り上げます。ドットに加えて、エポックセパレーターがあります。したがって、2:1.0 > 2.0(新しいエポックは前のエポックの番号付けよりも大きい)の検証。-リビジョン番号を区切ります。だから2-2 < 2.1-12 < 2.1(そしてリビジョンはメインバージョン番号の二次的なものです!)。ネガティブバージョンもあります。だから1.0~beta < 1.0、しかし1.0final > 1.0-これを「1.0マイナスベータ」と「1.0プラスファイナル」と読んでください。

これらをどのように読み取るかについての独自の基準はありません。.優先度の低いコンポーネントを分離する一般的な規則がありますが、~これはプレリリースの一般的な指標です(これが、後置されていないバージョンの前にソートする必要がある理由です)。

于 2013-01-03T17:12:15.203 に答える
3

This is basically Anny-Mousse's answer in code: The restriction is, there are only digits and dots allowed in a version number.

public class Version implements Comparable<Version> {

    private int[] version;

    public Version(String str) {
        if (!str.matches("\\d+[.\\d]*?\\d")) {
            throw new IllegalArgumentException(
                    "Version must start and end with digit and"
                    + "only contain digits and dots."
                    + " You provided '" + str + "'");
        }
        String[] tokens = str.split("\\.");
        version = new int[tokens.length];
        for (int i = 0; i < tokens.length; i++) {
            version[i] = Integer.parseInt(tokens[i], 10);
        }
    }

    @Override
    public int compareTo(Version other) {
        Version shorterOne =
                this.version.length < other.version.length ?
                this : other;
        int min = shorterOne.version.length;
        for (int i = 0; i < min; i++) {
            if (this.version[i] != other.version[i]) {
                return this.version[i] - other.version[i];
            }
        }
        return this.version.length - other.version.length;
    }

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder(2 * version.length);
        for (Integer i : version) {
            str.append(i).append('.');
        }
        return str.deleteCharAt(str.length() - 1).toString();
    }

    public static void main(String[] args) {
        String[] s = {"1.4","1.3","0.4","0.5","0.2","2.7","1.8","2.9","0.1"};
        List<Version> list = new ArrayList<>(s.length);
        for (String str : s) {
            list.add(new Version(str));
        }
        Version max = Collections.max(list);
        System.out.println(max);
    }
}
于 2013-01-03T17:26:34.310 に答える
1

Try as

    Arrays.sort(s, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            String[] a1 = o1.split("\\.");
            String[] a2 = o2.split("\\.");
            int c1 = Integer.parseInt(a1[0]) - Integer.parseInt(a2[0]);
            if (c1 != 0) {
                return c1;
            }
            return a1[1].compareTo(a2[1]);
        }

    });
于 2013-01-03T17:30:04.173 に答える