2013-05-31 2 views
0

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

Прежде всего, это то, что у меня есть (я simplyfied это немного): У меня есть List<Foo> list; где Foo имеет три атрибута:

public class Foo { 
    public int one; 
    public int two; 
    public long three; 
} 

теперь у меня есть другой List<int> list2;

Самое главное: первый элемент в list и первый в list2 соответствуют.

Что я хочу получить: Я хочу, чтобы иметь структуру, порог можно ввести один, два, три, а затем получить соответствующий int

Я устал это: я узнал макс значения одного, два и три, а затем создали int[maxOne][maxTwo][maxThree] и наполнили ее в цикле:

int count = 0; 
int[][][] daten = new int[maxOne][maxTwo][maxThree]; 
for (Foo foo : list) 
{ 
    daten[foo.one][foo.two][foo.three] = list2[count]; 
    count++; 
} 

, но это плохая идея, потому что new int[maxOne][maxTwo][maxThree]; нужно очень много памяти, а не каждое значение в этом 3 dimensinal массива необходимо.

Итак, какова ваша рекомендация?

+0

Просто пройти через 'list'. Или создайте ** двоичное дерево поиска **, если производительность является проблемой. – johnchen902

+0

Создавайте объекты, ставьте ассоциации, не используйте многомерные структуры. –

+0

Я думаю, вы можете использовать [SparceArray] (http://en.wikipedia.org/wiki/Sparse_array) –

ответ

5

Использовать HashMap<Foo, Integer>; только не забудьте переопределить hashcode и equals в Foo (equals должно быть достаточно легко, см this article для примера перекрывая hashcode)

+0

ok Я сделал HashMap и переопределив два метода, но как получить элемент, когда мне нужно создать свой собственный Foo раньше? HashMap не имеет. например: getEquals, он просто имеет значение – gurehbgui

+1

. Вам нужно будет получить значение с помощью чего-то типа 'map.get (новый Foo (один, два, три))' - вам нужно создать необходимый конструктор в 'Foo ' –

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