Как я могу инициализировать массив, не зная его размера?
У меня есть ситуация, когда я должен применять критерии для входного массива и повторно использовать другой массив в качестве вывода, который будет иметь меньший размер, основанный на критериях фильтрации.
Теперь проблема в том, что я не знаю размер отфильтрованных результатов, поэтому я не могу инициализировать массив с определенным значением. И я не хочу, чтобы он был большим размером, будет null, потому что я использую array.length; позже.
Один из способов состоит в том, чтобы сначала закодировать исходный массив ввода и установить счетчик, а затем сделать еще один цикл с длиной этого счетчика и инициализировать и заполнить этот массив []. Но так или иначе, чтобы выполнить эту работу только в одном цикле?
Ответы
Ответ 1
Вы не можете... размер массива всегда фиксируется в Java. Обычно вместо использования массива вы должны использовать реализацию List<T>
здесь - обычно ArrayList<T>
, но с множеством других доступных альтернатив.
Вы можете создать массив из списка в качестве конечного шага, конечно, или просто изменить подпись метода для возврата List<T>
для начала.
Ответ 2
Используйте LinkedList
вместо этого. Затем, при необходимости, можно создать массив.
Ответ 3
Использовать ArrayList. размер массива исправлен в java
Ответ 4
Просто верните список. ArrayList будет в порядке, его не статично.
ArrayList<yourClass> list = new ArrayList<yourClass>();
for (yourClass item : yourArray)
{
list.add(item);
}
Ответ 5
Если вы сделаете это так, вы можете просто объявить массив, а не использовать какие-либо коллекции.
ClassName[] arrayname;
...
arrayname = new ClassName[10*15*100*variable+CONSTANT+Math.ciel(Math.Random())];
Ответ 6
Вот код для вас. но это также содержит много рефакторинга. Пожалуйста, добавьте для каждого, а не для. приветствия:)
static int isLeft(ArrayList<String> left, ArrayList<String> right)
{
int f = 0;
for (int i = 0; i < left.size(); i++) {
for (int j = 0; j < right.size(); j++)
{
if (left.get(i).charAt(0) == right.get(j).charAt(0)) {
System.out.println("Grammar is left recursive");
f = 1;
}
}
}
return f;
}
public static void main(String[] args) {
// TODO code application logic here
ArrayList<String> left = new ArrayList<String>();
ArrayList<String> right = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
System.out.println("enter no of prod");
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
System.out.println("enter left prod");
String leftText = sc.next();
left.add(leftText);
System.out.println("enter right prod");
String rightText = sc.next();
right.add(rightText);
}
System.out.println("the productions are");
for (int i = 0; i < n; i++) {
System.out.println(left.get(i) + "->" + right.get(i));
}
int flag;
flag = isLeft(left, right);
if (flag == 1) {
System.out.println("Removing left recursion");
} else {
System.out.println("No left recursion");
}
}