所以我知道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
答案 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)
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
开始填充。