Как бы я определил бесконечное количество переменных? *Ява*

Я создаю игру, и для нее требуется бесконечное количество прямоугольников. Например, предположим, что я называю переменную car:

public Rectangle car1;
public Rectangle car2;
public Rectangle car3;

и так далее,

Может есть более простой способ? Нравиться:

public int carNumber;
public Rectange car + carNumber;//if carNumber was one, it would be called car1

Кроме того, мне нужно будет проверить, содержат ли прямоугольники другие. ‹-- Я знаю, как это сделать.


person Calan54    schedule 13.04.2014    source источник
comment
Совет: если вы имеете в виду, что заранее не знаете, сколько прямоугольников вам понадобится, правильное слово — неопределенный, а не бесконечный.   -  person ajb    schedule 13.04.2014


Ответы (5)


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

private List<Rectangle> carList = new ArrayList<>();

Это не сработает:

public Rectange car + carNumber;//if carNumber was one, it would be called car1

поскольку имена переменных не работают таким образом, их нельзя создать путем объединения строк. Но не беспокойтесь об этом, потому что об этом позаботится ArrayList. Третий элемент в списке можно было бы получить достаточно легко: carList.get(2).


Чтобы увидеть, содержат ли какие-либо прямоугольники в списке другой прямоугольник, используйте цикл for и выполните итерацию по коллекции:

for (Rectangle rect : carList) {
  if (rect.contains(testRectangle) {
     // this item contains the test Rectangle
  }
}
person Hovercraft Full Of Eels    schedule 13.04.2014
comment
Спасибо, но позволит ли это мне проверить метод contains() с каждым из прямоугольников? - person Calan54; 13.04.2014
comment
@ Gokarting54: да, конечно. Здесь важны не переменные; важны объекты и ссылки на объекты. - person Hovercraft Full Of Eels; 13.04.2014
comment
Ах я вижу. Это мой первый вопрос на StackOverflow, поэтому у меня не очень хорошая репутация, но если бы она была, я бы проголосовал за него. - person Calan54; 13.04.2014
comment
@ Gokarting54: не беспокойтесь о голосовании. Вы всегда можете вернуться позже. Обратите внимание на добавление информации о цикле for для проверки локализации. - person Hovercraft Full Of Eels; 13.04.2014
comment
Таким образом, в операторе for, использованном выше, testRectangle будет car1. Если бы у меня было 20 автомобилей, повторил бы я один и тот же код 20 раз и изменил бы имя «testRectangle»? Или было бы проще создать цикл while? - person Calan54; 13.04.2014
comment
@ Gokarting54 Пожалуйста, не копируйте код 20 раз. Я не знаю, проще ли воспроизвести код (может быть, с некоторыми причудливыми текстовыми редакторами). Но это плохая практика программирования. Если вам нужно внести изменения в свой алгоритм, и у вас есть один и тот же код 20 раз, вы должны внести изменения в 20 местах — что произойдет, если вы забудете одно? - person ajb; 14.04.2014

Вы бы использовали ArrayList для этого

person yitzih    schedule 13.04.2014

Массивы static memory allocation. Вам всегда нужно указывать размер массива при его создании, поэтому невозможно иметь "бесконечный" массив. То, что вы ищете, называется dynamic memory allocation.

Одним из примеров использования динамической памяти является ArrayList.

ArrayList позволяет расширять его при добавлении элементов и сжимать при удалении элементов. Вы можете увеличивать размер ArrayList так называемого "бесконечно", продолжая добавлять в него элементы. Однако ограничение на количество элементов, которые вы можете добавить, зависит от объема памяти вашей системы.

По сути, dynamic memory allocation — это то, что вам нужно. Вы также можете рассмотреть возможность использования Vector.

person user3437460    schedule 13.04.2014
comment
1+, хотя Vector API рекомендует предпочтительно использовать ArrayLists. - person Hovercraft Full Of Eels; 13.04.2014
comment
+1 для ArrayList, -1 для вектора. Vector сильно синхронизирован, и если в нем много объектов, синхронизированные накладные расходы действительно начинают складываться. - person Makoto; 13.04.2014
comment
@Makoto Мне удалить последнюю строку о векторе? - person user3437460; 13.04.2014

Извините, вы не можете сделать это в JAVA. Вы не можете создать имя переменной динамически.

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

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


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

Rectangle[] rec = new Rectangle[size];  

//get the first Rectangle 
Rectangle first = rec[0];

// get the total no of Rectangles
int length = rec.length();
person Braj    schedule 13.04.2014

в общем код вроде:

car1 = "blue";
car2 = "red";
car3 = "green";

в 99% случаев лучше выражается в виде массива

cars = ["blue", "red", "green"]

В Java массивы имеют фиксированную длину, когда вы их инициализируете, поэтому вы можете просто сделать большой или использовать ArrayList, как упомянутый выше комментатор, который представляет собой структуру списка, которая позволяет добавлять по одному.

person AuthorOfTheSurf    schedule 13.04.2014