Вы могли также использовать фоновое изображение на < li> элементы, с дополнением, чтобы помешать тексту перекрывать его.
li {
background-image: url(i/bullet.gif) no-repeat center left;
padding-left: 20px;
display: inline;
}
Я думаю, что ответ прост. Внедрите свой собственный компаратор, который выполняет сортировку без учета регистра, но НЕ возвращает 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 (). Они просто будут отсортированы вместе.
Для этого вам придется использовать две отдельные карты дерева с одинаковым содержимым, но с разными компараторами.
вам нужна мульти-карта : каждая запись этой мульти-карты хранит ключи без учета регистра и другую карту с исходными ключами в качестве значения.
Существует множество свободно используемых реализаций мультиотображений, таких как Общие коллекции , Коллекции Google и т. Д.
, возможно, это сработает:
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);
}
};
}
Используйте floorEntry , а затем upperEntry в цикле, чтобы найти записи без учета регистра; остановитесь, когда найдете точное совпадение ключа.
В 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 без явной установки компаратора) и сортировке записей без учета регистра, когда они вам нужны.
В дополнение ко всем другим ответам и согласию с тем, что невозможно иметь единую структуру TreeMap с разными компараторами:
Из вашего вопроса я понимаю, что у вас есть два требования: данные модель должна быть чувствительной к регистру (вам нужны значения, чувствительные к регистру, когда вы используете get ()
), докладчик должен быть нечувствительным к регистру (вам нужен порядок с учетом регистра, представление - это всего лишь предположение).
Предположим, мы заполняем карту отображениями (aa, obj1), (aA, obj2), (Aa, obj3), (AA, obj4). Итератор предоставит значения в следующем порядке: (obj4, obj3, obj2, obj1) (*). Какой же порядок вы ожидаете, если карта была упорядочена без учета регистра? Все четыре ключа будут равны, а порядок не определен. Или вы ищете решение, которое разрешило бы коллекцию {obj1, obj2, obj3, obj4} для ключа "AA"? Но это другой подход.
SO призывает сообщество быть честным: поэтому мой совет на этом этапе - еще раз взглянуть на ваше требование:)
(*) не проверено, предполагается, что 'A' <'a' = true.