2013-08-18 2 views
1

У меня есть одна проблема выбора используемого массива для этого случая. Есть много массивов, таких как список, ковер и другие. Я хочу сохранить два числа, подобные этому в массиве (числа здесь случайные): (много строк и 2 столбца).Лучший массив для этого случая

2, 4 
4, 8 
8, 7 
... 

Но также имеют функциональность с этим массивом, легко взять первую строку массива и поместить ее в конец. Что вы можете предложить мне в этом случае?

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

+0

Вы спрашиваете о структурах данных в целом; массивы - это всего лишь одна конкретная структура. Для чего вы его используете? – chrylis

+3

Существует только один массив - массив. Все остальные «массивы», которые вы упомянули, называются «коллекциями». – dasblinkenlight

+0

Для вашего конкретного случая попробуйте использовать HashMaps. :) – user2339071

ответ

2

Зависит от того, что вы имеете в виду, говоря легко. Простота программирования или высокая производительность. Поскольку вы новичок, я думаю, вы ищете первый. Я хотел бы придерживаться с ArrayList<Integer> или ArrayList<Pair<Integer, Integer>>, где пара является пользовательский класс как это:

public class Pair<A, B> 
{ 
    public Pair(A a, B b) { this.a = a; this.b = b; } 
    public A a; 
    public B b; 
} 

Затем используйте так:

List<Pair<Integer, Integer>> list = new ArrayList<Pair<Integer, Integer>>(); 
list.add(new Pair<Integer, Integer>(3, 5)); 
list.add(new Pair<Integer, Integer>(7, 1)); 
// now take the first and put it at the end: 
list.add(list.remove(0)); 

Edit: Если производительность перемещения первого элемента до конца это узкое место, и вы хотите, чтобы это быстро развивалось, а затем используйте LinkedList. Это будет операция O (1), а при использовании ArrayList это будет операция O (n).

3

Вы должны лучше создать класс, скажем, Pair:

class Pair { 
    private int i1; 
    private int i2; 

    public Pair(int i1, int i2) { this.i1 = i1; this.i2 = i2; } 

    public int getI1() { return i1; } 

    public int getI2() { return i2; } 
} 

А затем выбрать между ArrayList<Pair>, HashSet<Pair> и т.д. в зависимости от вас конкретных потребностей.

+0

hmm Я сделал что-то подобное ранее с другим классом, возможно, его работа будет работать. Спасибо, я попробую –

+0

+1: На самом деле мне нравится версия не-generics, потому что JVM будет постоянно боксировать и распаковывать. –

1

Во-первых, вы говорите о коллекциях, а не массивах: массив - это один конкретный вид коллекции и самый примитивный в этом. Вы должны использовать массивы непосредственно, когда количество элементов в коллекции известно в момент создания коллекции и никогда не изменяется после этого.

Если ваше требование, чтобы удалить элемент из начала сбора и вставив его в конце, то вы должны либо использовать Queue<T> или в LinkedList<T> и сделать объект, который представляет пару чисел ее общий тип аргументов , Эти структуры данных оптимизированы для быстрой вставки и удаления с концов.