Получение значения Max из числа в формате xyz - PullRequest
2 голосов
/ 30 января 2012

Существует ли простой способ найти число MAX из списка, в котором число хранится в формате xyz?Например, для управления некоторыми версиями системы.

Я пробовал Collection.max(list), и это не работает.

Пример кода:

public static void main(String args[])
{
    List<String> list = new ArrayList<String>();

    list.add("1.0.0");
    list.add("1.1.0");
    list.add("1.9.0");
    list.add("1.10.0");

    System.out.println(Collections.max(list));
}

Ожидаемый: 1.10.0
Результат: 1,9

Спасибо за ваше время.

Ответы [ 5 ]

2 голосов
/ 30 января 2012

Возможно, вам придется написать пользовательский Comparator для сравнения строк с номерами версий:

public class VersionComparator extends Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        // Get major/minor/revison numbers by splitting strings at dots
        String[] p1 = o1.split("\\.");
        String[] p2 = o2.split("\\.");

        // Compare major versions then minor then revision until a difference found
        for(int i = 0; i < (p1.length < p2.length) ? p1.length : p2.length; i++) {
            int result = Integer.valueOf(p1[i]).compareTo(Integer.valueOf(p2[i]));
            if(result != 0) return result;
        }

        // Return zero if they're identical
        return 0;
    }
}

Вы можете использовать этот компаратор с функцией Collections.max:

Collections.max(list, new VarsionComparator());
2 голосов
/ 30 января 2012

Попробуйте использовать это:

Collections.max(myList, new Comparator<String>() {

        @Override
        public int compare(String lhs, String rhs) {
            String[] first = lhs.split("\\.");
            String[] second = rhs.split("\\.");
            for (int i = 0; i < first.length; i++) {
                if(Integer.valueOf(first[i]) > Integer.valueOf(second[i])) {
                    return 1;
                }
                if(Integer.valueOf(first[i]) < Integer.valueOf(second[i])) {
                    return -1;
                }
            }
            return 0;
        }
    });
2 голосов
/ 30 января 2012

Во-первых, вам нужно убедиться, что Java знает, что они являются числами - на данный момент они просто Strings, а строки сортируются лексографически (то есть в «алфавитном порядке»).

Мой подход заключается в создании небольшого класса, который реализует Comparable, который будет автоматически работать с логикой сортировки и сравнения. Возможно, что-то вроде этого:

public class VersionNumber implements Comparable<VersionNumber> {
    public final int major;
    public final int minor;
    public final int patch;

    // Constructor etc. elided

    public int compareTo(VersionNumber other) {
        if (other.major != major) return major - other.major;
        if (other.minor != minor) return minor - other.minor;
        return patch - other.patch;
    }
}

Анализ строки для создания экземпляров этого класса оставлен читателю в качестве упражнения!

1 голос
/ 30 января 2012

Вы можете использовать версию max с указанным компаратором:

System.out.println(Collections.max(list, new Comparator<String>() {
    public int compare(String s1, String s2)
    {
        StringTokenizer st1 = new StringTokenizer(s1,".");
        StringTokenizer st2 = new StringTokenizer(s2,".");
        int res = 0;
        String t1, t2;
        while(st1.hasMoreTokens() && st2.hasMoreTokens())
        {
            t1 = st1.nextToken(); 
            t2 = st2.nextToken();
            res = Integer.valueOf(t1).compareTo(Integer.valueOf(t2));
        }
        if(res == 0)
        {
            res = st1.hasMoreTokens() ? 1 : (st2.hasMoreTokens() ? -1 : 0);
        }
        return res;

    }
    public boolean equals(Object obj) { return false; }
}));
0 голосов
/ 30 января 2012

Это даст вам 1,9, поскольку второе число не будет считаться 10, сначала оно будет рассматриваться как 1, а затем 9

Редактировать

Если выхотите сделать это вручную, затем

  1. Разделите ваш номер на основе "."
  2. Проверьте вручную, какое число больше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...