Nano Hash - криптовалюты, майнинг, программирование

Как лучше всего получить минимальное и максимальное значение из списка Comparables, который main содержит нулевые значения?

Я думаю примерно так:

public static <T extends Comparable<T>> T minOf(T...ts){        
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.first();
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.last();
}

Но не является нулевым безопасным, чего я тоже хочу.

Вы знаете, как лучше решить эту проблему?

РЕДАКТИРОВАТЬ:

После комментариев я также попробовал min ():

public static <T extends Comparable<T>> T minOf(T...ts){        
    return Collections.min(Arrays.asList(ts), new Comparator<T>(){

        public int compare(T o1, T o2) {
            if(o1!=null && o2!=null){
                return o1.compareTo(o2);
            }else if(o1!=null){
                return 1;
            }else{
                return -1;  
            }
        }});
}

Что вы думаете об этом?


  • Это неэффективно, поскольку вам нужно O (n log n) сравнений, поскольку TreeSet эффективно сортирует коллекцию, где n сравнений достаточно. Кроме того, вы создаете много ненужного мусора (Arrays.asList создает копию ts, а TreeSet тоже не является легковесным). 15.12.2008
  • Arrays.asList не копирует массив. 15.12.2008
  • Да, это сработает, но почему бы не объявить и не назвать этот компаратор в другом месте, чтобы его можно было использовать повторно? Затем вместо использования этой функции minOf просто вызовите стандартный Collections.min с этим названным компаратором. Ваш код становится более читаемым при использовании стандартных библиотечных вызовов. 15.12.2008
  • Я бы сказал, чтобы использовать Arrays.sort, а затем проверять элементы рядом с передней и задней частью, но он выдает исключение NullPointerException, если массив содержит нулевой элемент. 15.12.2008
  • для достижения наилучших результатов вы хотите использовать <T extends Comparable<? super T>> 09.06.2011

Ответы:


1

Что не так с Коллекциями .max?

А почему вас волнует нулевая безопасность? Вы уверены, что хотите, чтобы в вашей коллекции были пустые значения?

15.12.2008
  • Вопрос касался макс и мин. Collections.max () будет проверять каждый элемент. Затем выполнение Collections.min () снова будет проверять каждый элемент. Так что, может быть, сортировка всего один раз быстрее. 25.03.2015
  • Сортировка @ Yetti99 будет медленнее, потому что это O(n log n), а max + min равно O(2n). Что было бы немного лучше, так это сделать один цикл и обновить в нем max и min. И OP, похоже, не требует и того, и другого в одной функции. 02.06.2015
  • @Ciro Santilli 六四 事件 法轮功 纳米比亚 胡海峰 Вы правы насчет средней степени соучастия. Но если список почти упорядочен, сложность в лучшем случае будет O (n). И тогда вполне возможно, что приложению может потребоваться сортировка списка по какой-то другой причине. 05.06.2015

  • 2

    Если вам действительно нужно исключить «null» из результата, и вы не можете предотвратить его появление в вашем массиве, тогда, возможно, вам следует просто перебрать массив с помощью простого цикла и отслеживать «min» и «max». "в отдельных переменных. Вы по-прежнему можете использовать метод compare () для каждого объекта, чтобы сравнить его с вашими текущими значениями min и max. Таким образом, вы можете добавить свой собственный код для проверки нулей и их игнорирования.

    РЕДАКТИРОВАТЬ: вот код, чтобы проиллюстрировать то, о чем я говорю. К сожалению, есть крайний случай, который вам нужно рассмотреть - что, если все переданные аргументы равны нулю? Что возвращает ваш метод?

    public static <T extends Comparable<T>> T minOf(T...ts){
        T min = null;
        for (T t : ts) {
            if (t != null && (min == null || t.compareTo(min) < 0)) {
                min = t;
            }
        }
        return min;
    }
    
    public static <T extends Comparable<T>> T maxOf(T...ts){
        T max = null;
        for (T t : ts) {
            if (t != null && (max == null || t.compareTo(max) > 0)) {
                max = t;
            }
        }
        return max;
    }
    
    15.12.2008

    3

    Вы не должны реализовывать Comparable, чтобы принимать значение null, поскольку это нарушает контракт интерфейса.

    Из https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html:

    Обратите внимание, что null не является экземпляром какого-либо класса, и e.compareTo (null) должен вызывать исключение NullPointerException, даже если e.equals (null) возвращает false.

    Вместо этого вы должны создать новый интерфейс, например ComparableNull вместо этого.

    Смотрите также:

    02.06.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..