(Компаратор) Java TreeMap и получает метод, игнорирующий компаратор

Вы могли также использовать фоновое изображение на < li> элементы, с дополнением, чтобы помешать тексту перекрывать его.

li {
  background-image: url(i/bullet.gif) no-repeat center left;
  padding-left: 20px;
  display: inline;
}
8
задан Chii 23 November 2009 в 12:12
поделиться

7 ответов

Я думаю, что ответ прост. Внедрите свой собственный компаратор, который выполняет сортировку без учета регистра, но НЕ возвращает 0 для «A» и «a» ... также сортирует их.

Проблема в том, что ваш компаратор возвращает 0 для сравнения («A», «a») регистр, что означает, что это тот же ключ, что касается карты.

Используйте компаратор, например:

public final Comparator<String> ID_IGN_CASE_COMP = new Comparator<String>() {

    public int compare(String s1, String s2) {
        int result = s1.compareToIgnoreCase(s2);
        if( result == 0 )
            result = s1.compareTo(s2);
        return result;
    }
};

Тогда все ключи будут использоваться независимо от регистра и «a» и «A» по-прежнему будут отсортированы вместе.

Другими словами, get («a») даст вам значение, отличное от get («A») ... и они оба будут отображаться в итераторах keySet (). Они просто будут отсортированы вместе.

8
ответ дан 5 December 2019 в 10:03
поделиться

Для этого вам придется использовать две отдельные карты дерева с одинаковым содержимым, но с разными компараторами.

1
ответ дан 5 December 2019 в 10:03
поделиться

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

Существует множество свободно используемых реализаций мультиотображений, таких как Общие коллекции , Коллекции Google и т. Д.

1
ответ дан 5 December 2019 в 10:03
поделиться

, возможно, это сработает:

    new Comparator<String>(){
    public int compare(String s1, String s2)
    {
        String s1n = s1.toLowerCase();
        String s2n = s2.toLowerCase();

        if(s1n.equals(s2n))
        {
            return s1.compareTo(s2);
        }
        return s1n.compareTo(s2n);
    }
};
                                                    }
1
ответ дан 5 December 2019 в 10:03
поделиться

Используйте floorEntry , а затем upperEntry в цикле, чтобы найти записи без учета регистра; остановитесь, когда найдете точное совпадение ключа.

-1
ответ дан 5 December 2019 в 10:03
поделиться

В TreeMap добавление двух ключей a и b (в указанном порядке) так, что compare (a, b) возвращает 0, приведет к тому, что последняя добавленная запись (b) будет перезаписывать первую one (a).

В вашем случае это означает, что нечувствительность к регистру get (id) никогда не будет использоваться.

цитирование http://java.sun.com/javase/6/ docs / api / java / util / TreeMap.html

Обратите внимание, что порядок, поддерживаемый отсортированной картой (независимо от того, предоставляется ли явный компаратор), должен согласовываться с equals, если эта отсортированная карта должна правильно реализовать интерфейс Map. (См. Comparable или Comparator для точного определения согласованности с равенством.) Это так, потому что интерфейс Map определен в терминах операции равенства, но карта выполняет все ключевые сравнения, используя свой метод compareTo (или compare), поэтому два ключа, которые считаются равными с помощью этого метода, с точки зрения отсортированной карты равны. Поведение отсортированной карты четко определено, даже если ее порядок несовместим с equals; он просто не подчиняется общему соглашению интерфейса карты.

Вероятно, это не то, что вам нужно.

Если карта сравнительно мала и вам не нужно получать отсортированные записи очень много раз, решение заключается в использовании HashMap (или TreeMap без явной установки компаратора) и сортировке записей без учета регистра, когда они вам нужны.

7
ответ дан 5 December 2019 в 10:03
поделиться

В дополнение ко всем другим ответам и согласию с тем, что невозможно иметь единую структуру TreeMap с разными компараторами:

Из вашего вопроса я понимаю, что у вас есть два требования: данные модель должна быть чувствительной к регистру (вам нужны значения, чувствительные к регистру, когда вы используете get () ), докладчик должен быть нечувствительным к регистру (вам нужен порядок с учетом регистра, представление - это всего лишь предположение).

Предположим, мы заполняем карту отображениями (aa, obj1), (aA, obj2), (Aa, obj3), (AA, obj4). Итератор предоставит значения в следующем порядке: (obj4, obj3, obj2, obj1) (*). Какой же порядок вы ожидаете, если карта была упорядочена без учета регистра? Все четыре ключа будут равны, а порядок не определен. Или вы ищете решение, которое разрешило бы коллекцию {obj1, obj2, obj3, obj4} для ключа "AA"? Но это другой подход.

SO призывает сообщество быть честным: поэтому мой совет на этом этапе - еще раз взглянуть на ваше требование:)

(*) не проверено, предполагается, что 'A' <'a' = true.

0
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: