Карты с несколькими типами значений в Java - PullRequest
8 голосов
/ 13 февраля 2012

Я должен выполнить странный странный сценарий. Это описывается следующим образом:

Мне нужно спроектировать Карту, где ' Ключи ' всегда имеют тип String . Однако ' значение ' для одного из ключей может быть строкой или списком (зависит от количества значений, которые может иметь конкретный ключ. 'Значение' будет строкой если этот конкретный ключ имеет только одно значение, и он должен быть списком, если ключ содержит много значений). Как реализовать этот сценарий?

Например: на карте есть 2 клавиши, а именно «Имя» и «Номера телефонов». Человек может иметь только одно имя и несколько телефонных номеров. Итак, здесь первый ключ, т. Е. «Имя», должен иметь тип «String» для значения, тогда как для второго ключа, т. Е. «Номера телефонов», должен иметь тип «Список» для значения. Как объявить такую ​​карту. Возможно ли это?

Ответы [ 5 ]

13 голосов
/ 13 февраля 2012

Можно сделать что-то вроде Map<String, Object>.

Но : Я бы настоятельно рекомендовал продумать ваш дизайн. Вы должны использовать класс для своих людей вместо этого. Таким образом, вы можете сделать: Map<String, Person> с Person, имеющим методы получения и установки имен, телефонных номеров и другой информации.

Пример Person класс:

public class Person {

    private String name;
    private List<String> phoneNumbers = Collections.emptyList();

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setPhoneNumbers(List<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

    public void addPhoneNumber(String number) {
        phoneNumbers.add(number);
    }

    public List<String> getPhoneNumbers() {
        return phoneNumbers;
    }
}
3 голосов
/ 13 февраля 2012

Конечно, есть. Выберите свой яд:

Map<String, Object> mixed = new HashMap<String, Object>();

Map<String, Serializable> mixed = new HashMap<String, Serializable>();

@SuppressWarnings("rawtypes")
Map mixed = new HashMap();
1 голос
/ 13 февраля 2012

Я бы сделал одно из следующих действий:

  1. Используйте Multimap<String, String>. Мультикарта будет содержать одно или несколько значений, связанных с каждым ключом.

  2. Используйте Map<String, Either<String, List<String>>>.Используйте Либо , чтобы различать одно или несколько значений.

1 голос
/ 13 февраля 2012

Ну, а почему бы не сделать Map<String, List<String>>? Вы всегда можете просто добавить один элемент в свой список, если есть только одно значение, или использовать общий супертип String и List, таким образом, вы получите

Map<String, Object>
0 голосов
/ 13 февраля 2012

Почему бы не создать класс-оболочку PhoneNumber, который предоставляет API для хранения одного или нескольких телефонных номеров, а затем может извлечь один или все (несколько) телефонных номеров, а затем создать карту String и PhoneNumber?Что-то вроде:

class PhoneNumber {


  private String[] phoneNumbers;


  public void storePhoneNumber(String... phoneNumbers) {
     this.phoneNumbers = phoneNumbers;
  }

  public String getPhoneNumber() {
    if(phoneNumbers.length>=1) {
      return phoneNumbers[0];
    } else {
      return null;
    }

  }

  public List<String> getPhoneNumbers() {
    if(phoneNumbers!=null) {
      return Arrays.asList(phoneNumbers);
    } else {
      return null;
    }

  }

}

...