如何在不知道数组大小的情况下初始化数组?
Posted
技术标签:
【中文标题】如何在不知道数组大小的情况下初始化数组?【英文标题】:How can I initialize an array without knowing its size? 【发布时间】:2011-05-30 22:00:31 【问题描述】:我有一种情况,我必须在输入数组上应用一个标准,然后返回另一个数组作为输出,该输出将根据过滤标准具有更小的大小。
现在的问题是我不知道过滤结果的大小,所以我不能用特定的值初始化数组。而且我不希望它太大,因为我使用的是 array.length;稍后的。
一种方法是首先循环原始输入数组并设置一个计数器,然后使用该计数器长度进行另一个循环并初始化并填充此数组[]。但是有没有办法只用一个循环来完成这项工作?
【问题讨论】:
【参考方案1】:你不能...数组的大小在 Java 中总是固定的。通常,您不会使用数组,而是在此处使用 List<T>
的实现 - 通常是 ArrayList<T>
,但还有很多其他可用的替代方案。
当然,您可以从列表中创建一个数组作为最后一步 - 或者只是更改方法的签名以返回 List<T>
开始。
【讨论】:
为什么在这种情况下你更喜欢ArrayList
而不是LinkedList
?
@Roman:我通常自然而然地使用 ArrayList。 LinkedList 也可以……当然,它在内存方面更昂贵,但它不需要在扩展时复制元素。
@Roman:请参阅When to use LinkedList over ArrayList 进行讨论。话虽如此,您的第一个倾向应该是ArrayList
。【参考方案2】:
请改用LinkedList
。然后,如果需要,您可以创建一个数组。
【讨论】:
ArrayList
可能更合适
@Noel M:为什么?我认为不会。我们不知道元素的数量。因此,使用 LinkedList 时,每个添加(即 addLast)操作都在 O(1) 中工作并且确实做了一点工作,而 ArrayList
会自动增加其大小数倍,这些操作成本很高。
另一方面,使用 LinkedList 您正在为每个元素创建一个 Node 对象。您声称扩展是一项“代价高昂”的操作——只需创建一个新数组并复制现有元素(可以是快速数组复制)。我认为很难说在这种情况下哪个统一“更好”。【参考方案3】:
只需返回任何类型的列表。 ArrayList 没问题,它不是静态的。
ArrayList<yourClass> list = new ArrayList<yourClass>();
for (yourClass item : yourArray)
list.add(item);
【讨论】:
【参考方案4】:这是你的类的代码。但这也包含很多重构。请为每个而不是为。干杯:)
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");
【讨论】:
【参考方案5】:如果您使用的是 Java 8 或更高版本,则可以使用 Stream
。这是一个仅提取int[]
中的偶数的示例。
static int[] evenFilter(int[] input)
return IntStream.of(input)
.filter(i -> i % 2 == 0)
.toArray();
public static void main(String args[]) throws IOException
int[] input = 3, 4, 22, 36, 49, 51;
int[] output = evenFilter(input);
System.out.println(Arrays.toString(output));
输出:
[4, 22, 36]
【讨论】:
以上是关于如何在不知道数组大小的情况下初始化数组?的主要内容,如果未能解决你的问题,请参考以下文章
数组适配器中的 get count() 如何在不显式返回数组大小的情况下返回值?
在不知道输出数组大小的情况下,像 matlab 一样在 python 中连接数组