Использование ключа TreeMap как набора двух разных типов

Я новичок в java. При использовании TreeMap я хотел использовать ключ как набор из двух объектов, а также компаратор должен быть комбинацией этих двух типов. Более четко то, что я хочу:

Comparator<int> in = (in1,in2)-> {
                                 return in1.compareTo(in2);
                                 }

Comparator<String> str = (str1,str22)-> {
                                 return str1.compareTo(str22);
                                 }
Map<int , Table > table1 = new TreeMap<int,Table>(in);
Map<String , Table > table2 = new TreeMap<str,Table>(str);

Есть ли способ использовать ключ как набор как int, так и строки вместо того, чтобы делать их отдельными, что-то похожее на шаблон.

Спасибо за помощь..!!


person katherine    schedule 20.08.2013    source источник
comment
Вам нужно использовать классы-оболочки: Comparator<Integer> и Map<Integer, Table>.   -  person arshajii    schedule 20.08.2013
comment
Вы можете создать отдельный класс и иметь типы int и String в качестве поля в этом классе.   -  person Rohit Jain    schedule 20.08.2013


Ответы (2)


Конечно. Создайте ключевой класс из int и String:

class Key implements Comparable<Key> {
  private final int i;
  private final String str;
  public Key(int i, String str) {...}
  public int compareTo(Key key) {...}
}

TreeMap<Key, Table> map = ...
person Louis Wasserman    schedule 20.08.2013
comment
Key — это лучшее, что можно сделать в примере кода. Предположительно, в комбинации двух типов есть некий смысл, и это должно быть основой для идентификатора класса в реальном коде. - person Patricia Shanahan; 20.08.2013
comment
Map‹String , Table› table2 = new TreeMap‹str,Table›(Key); это правильно?? - person katherine; 21.08.2013
comment
@katherine: Нет, Map<Key, Table> table = new TreeMap<Key, Table>(). - person Louis Wasserman; 21.08.2013

Вы можете создать TreeMap<Object, Table> и использовать Integers (не ints) и Strings в качестве ключей. Просто убедитесь, что вы используете компаратор, который последовательно сортирует все целые числа перед любой строкой.

SortedMap<Object, Table> mixedKeyMap = new TreeMap<Object, Table>(
    new Comparator() {
      public int compare(Object a, Object b) {
        if (a instanceof Integer) {
          if (b instanceof Integer) {
            return ((Integer) a).compareTo((Integer) b);
          } else {
            assert b instanceof String;
            return -1;
          }
        }
        assert a instanceof String;
        if (b instanceof Integer) {
          return 1;
        }
        return ((String) a).compareTo((String) b);
      }
    });
person Mike Samuel    schedule 20.08.2013