数组和扩展的困境

时间:2014-01-24 20:01:52

标签: java arrays loops counter

所以我知道java约定是使用ArrayList<>当谈到扩展和许多其他应用程序。典型的阵列无法扩展。我的java课程是初级的,所以我们现在仍在审查数组。尽管我想使用一个arraylist我不能。如何将它存储到我只存储满足计数器数组条件的元素的地方?

public int[] above100Degrees()
   {
      int[] blazing = new int[temps.length];
      for( int i = 0; i < temps.length; i++ )
      {
         if( temps[i] > 100 )
         {
            blazing[i] = temps[i];
         }
      }
      return blazing;
   }

输出

The temperature above 100 degrees is:   0   0   0   0   0   0   0   103 108 109

5 个答案:

答案 0 :(得分:5)

只需计算与您的过滤器首先匹配的元素数量,然后创建数组,然后填充它。这意味着你需要经历两次数组,但除非你想最终创建多个数组,否则没有其他很好的选择。如下所示:

public int[] above100Degrees() {
    // First work out how many items match your filter
    int count = 0;
    // Are you allowed to use the enhanced for loop? It's not necessary, but it
    // makes things simpler.
    for (int temp : temps) {
        if (temp > 100) {
            count++;
        }
    }

    // Create an array of the right size...
    int[] ret = new int[count];

    // ... and populate it.
    int index = 0;
    for (int temp : temps) {
        if (temp > 100) {
            ret[index++] = temp;
        }
    }
    return ret;
}

答案 1 :(得分:3)

在分配数组之前,我会使用一个循环来查找有多少超过100的数据。

public int[] above100Degrees()
{
    int newArrayLength=0;
    for( int i = 0; i < temps.length; i++ )
    {
        if( temps[i] > 100 )
        {
            newArrayLength++;
        }
    }

    int[] blazing = new int[newArrayLength];
    int positionInNewArray = 0;
    for( int i = 0; i < temps.length; i++ )
    {
        if( temps[i] > 100 )
        {
            blazing[positionInNewArray] = temps[i];
            positionInNewArray++;
        }
    }
    return blazing;
}

答案 2 :(得分:1)

你可以做ternary operation

resultString = "The temperature above 100 degrees is: ";
for(int i = 0; i < blazing.length; i++){
    resultString += blazing[i] != 0 ? blazing[i] : "";
}

注意:这需要比JonSkeets更多的内存,但可能更有效。如果您希望阵列长度变得非常大,请使用JonSkeet的答案。换句话说,这不会很好地扩展。

答案 3 :(得分:1)

一种方法是在设置阵列之前对事物进行计数。另一种方法是首先设置数组并跟踪计数,然后创建一个新数组:

public int[] above100Degrees()
   {
      int[] blazing = new int[temps.length];
      int count = 0;
      for( int i = 0; i < temps.length; i++ )
      {
         if( temps[i] > 100 )
         {
            blazing[count++] = temps[i];
         }
      }

      // At this point, `count` is the number of elements you're going to return;
      // and the first `count` elements of `blazing` hold those elements, while the
      // remaining elements of `blazing` are garbage

      int[] result = new int[count];
      for ( int i = 0; i < count; i++ )
           result[i] = blazing[i];

      return result;
   }

如果您测试的条件需要花费大量时间来计算(与temps[i] > 100相反,这几乎不需要任何时间),这种方法会更好。您可以使用Arrays.copy创建结果数组,但如果您不能使用ArrayList,则可能也无法使用Arrays.copy

答案 4 :(得分:0)

您的代码将blazing数组中的单元格保留为i <= 100;您需要忽略这些并从i = 101开始填充。