【问题标题】:How can I initialize an array without knowing its size?如何在不知道数组大小的情况下初始化数组?
【发布时间】:2011-05-30 22:00:31
【问题描述】:

我有一种情况,我必须在输入数组上应用一个标准,然后返回另一个数组作为输出,该输出将根据过滤标准具有更小的大小。

现在的问题是我不知道过滤结果的大小,所以我不能用特定的值初始化数组。而且我不希望它太大,因为我使用的是 array.length;稍后的。

一种方法是首先循环原始输入数组并设置一个计数器,然后使用该计数器长度进行另一个循环并初始化并填充此数组[]。但是有没有办法只用一个循环来完成这项工作?

【问题讨论】:

    标签: java arrays arraylist size variable-length-array


    【解决方案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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 2023-02-20
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 2021-07-19
          相关资源
          最近更新 更多