2013-10-12 3 views
1

Я изучаю Java и пытаюсь обвести вокруг этих структур данных. Я прихожу из Python/PHP, поэтому я привык к динамическому масштабированию массивов на лету и возможности хранить несколько типов данных в одном массиве.Java - arraylist многомерных массивов или arraylist многомерных arraylists?

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

Пример в псевдо-иш коде, если я имел 3 строки:

array(array("description1", 10.00), 
     array("description2", 12.00), 
     array("description3", 14.00)); 

Тогда, я хочу, чтобы перебрать массив для обработки datawith что-то вроде:

foreach(rows as row){ 
    myStringVal = row[0]; //on first iteration would be "description1" 
    myIntVal = row[1]; //on first iteration would be 10.00 
    ... do something with the values ... 
} 

Я думаю Мне нужно создать arraylist, который содержит массив, но я не могу хранить как строки, так и парные в массиве java, так что я делаю? Вместо этого я использую карту и рассматриваю ее так, как если бы это был массив? Например, я создаю карту, где первый элемент является числовым идентификатором для каждой строки, второй элемент - это строковое значение, третий элемент - это двойное значение, а затем я использую цикл для увеличения счетчика и захвата каждой строки с карты, которая использует числовой идентификатор>

Действительно смущен относительно того, как это будет работать. Какие-либо предложения? Благодаря!

ответ

7

Вы не хранить «различного рода ценностей», вы храните семантические данные, которая кодирует «кортеж», но с использованием концепции не-Java из просто торчит, что в массиве. Не делайте этого, вместо того, чтобы использовать концепцию C/C++/Java кодирования связанных данных в качестве структуры/объекта:

// our "struct"esque class for the linked data we're handling 
class MyObject { 
    String description; 
    float value; 
    Public MyObject(String description, float value) { 
    this.description = description; 
    this.value = value; 
    } 
} 

// build our list of objects 
ArrayList<MyObject> mylist = new ArrayList<MyObject>(); 
mylist.add(new MyObject("description1", 10)); 
mylist.add(new MyObject("description2", 12)); 
mylist.add(new MyObject("description3", 14)); 
... 

// and then we iterate 
String d; float v; 
for(MyObject m: mylist) { 
    d = m.description; 
    v = m.value; 
    ... 
} 
+0

Ницца, очень нравится этот ответ тоже. Делает полный смысл. Хотел бы я дать два ответа. – user797963

+0

+1 «Правильный» Java-стиль должен также реализовывать «equals() и hashcode()» и, возможно, toString(). – user949300

+0

Не для объекта структуры. equals и hashcode необходимы только в том случае, если вы намереваетесь выполнить сопоставление/хеширование, которое мы не делаем в этом случае (они по умолчанию унаследованы от Object) –

0

Используйте класс вместо массива.

public class X 
{ 
    private final String description; 
    private final double value; 

    public X(final String desc, 
      final double val) 
    { 
     decription = desc; 
     value  = val; 
    } 

    // getters 
} 

Если вы хотите изменить описание и значение, не делайте их окончательными.

Вы можете сделать переменные description и value общедоступными, но я бы избегал этого соблазна.

2

Это выглядит как List<Map<String, BigDecimal>> для меня.

  • List даст вам возможность вводить более одного элемента непрерывно.
  • Map предоставит вам связь между String и значением с плавающей запятой, которое я выбрал BigDecimal. Вы можете использовать Double, если хотите.

    List<Map<String, BigDecimal>> elements = new ArrayList<>(); 
    elements.add(new HashMap<String, BigDecimal>()); 
    elements.get(0).put("description1", BigDecimal.valueOf("10.00")); 
    
+0

Спасибо, я собираюсь выбрать это как ответ, но мне нравится Майк «Pomax «Ответ Камермана тоже ... это, вероятно, лучший способ сделать это, но сейчас я ищу быстрый/грязный способ. Хотел бы я дать два ответа на галочку. – user797963

+0

, чтобы быть справедливым, вы могли бы это сделать, но это вполне примечательный способ Java, где правильный подход ООП заключается в кодировании всего, что представляет «вещь» как объект. Учитывая этот вопрос, это звучит как достойное решение, но, учитывая предполагаемое поведение программы, это не так:) –

+0

@Mike Да, я определенно согласен.Какая-то отстойная, что я должен следовать вместе с классом, в котором я участвую, и для этого нужно делать «неправильный» способ, но это заставляет нас хорошо изучать структуры данных. Я потерял очки в прошлом за использование техник, которые еще не преподавались в классе, поэтому я собираюсь придерживаться этой идеи на данный момент. – user797963

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