Массивы разных типов - PullRequest
8 голосов
/ 12 мая 2010

Возможно ли иметь массив, который содержит два разных типа данных? Я хочу иметь массив, который содержит двойной, а также строку. Я попытался:

ArrayList<double><String> array;

Но это не сработало.

Извините за глупый вопрос, но прошло уже много времени с тех пор, как я использовал что-то вроде этого ... Можете ли вы обновить память о том, как бы я объявил и заполнил такой массив?

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

Спасибо!

Ответы [ 10 ]

14 голосов
/ 12 мая 2010

Во-первых, стоит иметь в виду разницу между массивом и ArrayList - это совсем не одно и то же.

Однако в любом случае вы не можете делать то, что хотите. Самое близкое, на что вы можете прийти - это объявление своего типа. (РЕДАКТИРОВАТЬ: мой исходный код имел двойную или строку ... Теперь я изменил ее на двойную и строку. Дайте мне знать, если это изменение не , что вы имели в виду.)

public final class DoubleAndString
{
    private final String stringValue;
    private final double doubleValue;

    public DoubleAndString(String stringValue, double doubleValue)
    {
        this.stringValue = stringValue;
        this.doubleValue = doubleValue;
    }

    public String getString()
    {
        return stringValue;
    }

    public String getDouble()
    {
        return doubleValue;
    }
}

Затем создайте ArrayList<DoubleAndString> или DoubleAndString[].

Теперь, это кажется несколько ванильным на данный момент - предположительно, двойные и строковые значения на самом деле имеют большее значение - например, имя и оценка. Если это так, инкапсулируйте это в тип, который описывает связывание более подходящим образом.

Что касается порядка - вы могли бы сделать DoubleAndString реализовать Comparable<DoubleAndString> - но если это не естественный порядок only , который имеет смысл, я бы написал Comparator<DoubleAndString>:

public class DoubleComparator implements Comparator<DoubleAndString>
{
    public int compare(DoubleAndString ds1, DoubleAndString ds2)
    {
        return Double.compare(ds1.getDouble(), ds2.getDouble());
    }
}

Затем вы можете использовать Collections.sort для сортировки ArrayList<DoubleAndString> или Arrays.sort для сортировки массива.

6 голосов
/ 12 мая 2010

Вы можете использовать ArrayList<Object>, а затем можете использовать все, что захотите.Инкапсулируйте double в объекте Double, и при извлечении объекта используйте instanceof, чтобы проверить, действительно ли это double или String.

Я должен сказать, что это маловероятнодизайн "выиграет вам любые награды.Можно ли переосмыслить решение, которое вы рассматриваете для своей проблемы, и посмотреть, сможете ли вы сделать это с другим подходом?

3 голосов
/ 12 мая 2010

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

2 голосов
/ 12 мая 2010

ArrayList по определению содержит только один объект на позицию. Вы могли бы сделать что-то вроде этого:

List<MyTuple> list = new ArrayList<MyTuple>();

public static class MyTuple implements Comparable<MyTuple> {

    private Double doubleValue;
    private String stringValue;

    //getters and setters

    public int compareTo(MyTuple tuple) {
        return doubleValue.compareTo(tuple.getDoubleValue());
    }
}

Затем вы можете использовать метод Collections.sort (), чтобы отсортировать его по типу Doubles.

2 голосов
/ 12 мая 2010

Вы можете просто сделать ArrayList<object> arraylist, а затем вы можете положить что-нибудь в него, но это может быть не то, что вы хотите.

Тогда для сортировки вы просто использовали бы свой собственный компаратор, но, как уже упоминалось, эти два значения должны быть связаны, или у вас есть одномерный массив с двумя разными типами данных?

2 голосов
/ 12 мая 2010

Ну, если вы хотите иметь массив с произвольным числом элементов, то вам просто нужно использовать тип, который является общим предком для обоих. В этом случае это будет Object (поскольку String и Double оба наследуются от Object). Это потребует от вас проверки типов, однако, когда вы извлекаете или используете их.

Если вы используете фиксированное количество нескольких разных типов, то вам действительно нужен «кортеж». Однако в настоящее время Java не имеет доступной реализации кортежа. Для двух предметов:

public class Pair<T1,T2>
{
    public Pair(){
          this(null,null);
    }

    public Pair(T1 x1){
          this(x1,null);
    }

    public Pair(T1 x1, T2 x2){
         _x1 = x1;
         _x2 = x2;
    }

    public T1 getFirst(){
        return _x1;
    }

    public T1 getSecond(){
        return _x2;
    }

    private T1 _x1;
    private T2 _x2;
}
2 голосов
/ 12 мая 2010

Звучит так, будто вы хотите карту. Поскольку вы хотите отсортировать карту, TreeMap может быть оптимальным.

Map<Double, String> myMap = new TreeMap<Double, String>();

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

Map<Double, ArrayList<String>>
1 голос
/ 12 мая 2010

Что вы хотите сделать?

Если это не отображение значения ключа, вы должны создать для этого новый класс.

0 голосов
/ 12 мая 2010

если вы в принципе не пытаетесь делать какие-либо сравнения / сортировку в ArrayList, тогда вы можете создать что-то, как показано ниже:

List list = new ArrayList ();

в противном случае ... Ответ Джона Скита был наилучшим.

0 голосов
/ 12 мая 2010

Возможно, вы захотите взглянуть на базовый класс номеров.

List<Number> list = new ArrayList<Number>(); 
list.add(new Integer(3)); 
list.add(new Double(5.2));

Вы можете интерпретировать числа как строки, используя NumberFormat:

NumberFormat formatter = new DecimalFormat("#.##");
String s = formatter.format(list.get(0));

Хотя это, возможно, и не то, что вы хотите, но вам не хватает подробностей о вашей конечной цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...