如何在不知道数组大小的情况下初始化数组?

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 中连接数组

C#如何在不知道新数组长度的情况下将数组中的值保存到新数组中

C语言如何定义一个N行N列的二维数组任意输入数据