2010-05-12 2 views
8

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

ArrayList<double><String> array; 

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

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

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

Спасибо!

+1

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

ответ

14

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

Однако в любом случае вы не можете делать то, что хотите. Самое близкое, что вы, возможно, придете, объявляет ваш собственный тип. (EDIT: у моего исходного кода была двойная или строка ... Я теперь изменил ее как двойную и строку. Дайте мне знать, если это изменение не что вы имели в виду.)

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> - но если это не самый только естественный порядок, который имеет смысл, я бы написать 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, чтобы отсортировать массив.

+0

+1, бил. Это будет мое предложение и пользовательский тип данных. – Robb

2

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

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

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

Map<Double, ArrayList<String>> 
1

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

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

2

Ну, если вы хотите иметь массив с произвольным количеством элементов, вам просто нужно использовать тип, который является общим предком для обоих. В этом случае это будет 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

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

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

5

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

Должен сказать, вряд ли этот «дизайн» принесет вам любые награды. Возможно ли переосмыслить решение, которое вы рассматриваете для своей проблемы, и посмотреть, можете ли вы сделать другой подход?

3

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

2

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() для сортировки по двойникам.

0

Возможно, вам захочется посмотреть на базовый класс Number.

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)); 

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

0

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

список List = новый ArrayList();

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

Смежные вопросы