繁体   English   中英

卡在Java中使用数组

[英]Stuck using arrays in java

我对编码还是很陌生。 我试图采用充满“ x”个元素的数组,并且需要找到一个数字范围。 参数采用一个数组,一个最小数和一个最大数。 最终结果需要包括最小值,最大值以及它们之间的数字。 这是我正在谈论的一个示例:

The starting array:[2, 8, 7, 3, 4]   
Min value: 1
Max value: 5
End result: [2, 3, 4] 

我希望这不会造成混淆,并且我对它的解释已经足够理解。

我的代码是这样的:

public static int[] range(int[] a, int low, int high) 
{
  int[] rangeArray = new int[0];

  for (int i = low; i <= high; i++)
  {  
     if (low >= a.length && high <= a.length)
     {
        rangeArray[i] = a[i];
     }
  }

  return rangeArray;
}

您的第一个问题在这里:

int[] rangeArray = new int[0];

这样做是实例化一个名为rangeArray的整数数组。 然后,将其初始化为长度为0 因此,添加到该数组的任何内容都将超出范围。 您应该将其初始化为返回结果的长度。 在这种情况下很难。

然后我们有以下代码块:

for (int i = low; i <= high; i++) //start at the lowest possible number and go to the highest
{  
   //check for validity
}

这里有一些概念问题。 你从lowhigh迭代。 如果low非常低(-1百万?)而high同样非常高怎么办? 很多想法没有结果。

相反,让我们遍历实际得到的数组:

for (int idx = 0; idx < a.length; idx++) {
  //Check the value of int, if it is in the desired range, save it.
}

最后,让我们考虑一下:

if (low >= a.length && high <= a.length)

粗略地解释为“如果我想要的范围的下限大于我要检查的数字列表的长度,而我的范围的上限小于相同长度,则采取“真”分支。 这不是您要找的东西。

相反,您希望“如果当前索引值在我的低点和高点之间,请保留它”。

if (a[idx] >= low && a[idx] <= high)

卷起它,我们得到:

public static int[] range(int[] a, int low, int high) 
{
  int[] rangeArray = new int[a.length];//this is the most we will need
  int numbersFound = 0;//to keep track of result array index    

  for (int idx = 0; idx < a.length; idx++) {
  {  
     if (a[idx] >= low && a[idx] <= high)
     {
        rangeArray[numbersFound++] = a[i];
     }
  }

  return rangeArray;
}

请注意,在这种情况下,您的数组末尾可能会有一些空单元格。 使用前请小心!

您的逻辑不正确。

  1. 数组的大小分配为零。 如果没有空间,如何将某些东西存储在该容器中?
  2. 您的循环计数器已关闭。
    • 遍历数组的最简单方法是从头开始并移至末尾
    • 数组索引从零开始
    • 数组索引最多为(length-1)
  3. 您需要在测试中使用上下限。

伪代码

initialize result to the same size as the input
foreach(item in array) 
{
   if(item is in range) {
      add item to result
    }
}

接近代码

results = new Int[a.length()];
int resultsPosition = 0;
for(int i = 0; i < a.length(); i++) {
     if(a[i] => low  && a[i] <= high) {
           results[reultsPosition] = a[i];
           resultsPosition++;
     }
} 

为了方便和易读,我不会急于生成一个数组并在以后对其进行剪切,因为这似乎很浪费(如果我有许多整数的数组,但只有少数几个匹配,该怎么办?)

我会喜欢这样的:

List<Integer> temp = new List<>();
    for(int i = 0 ; i < a.length ; i++){
        if (low <= a[i]  && high >= a[i] ){
           temp.add(a[i]);
        }
}
return ArrayUtils.toPrimitive(temp.toArray(new Integer[temp.size()]));

这在很大程度上是因为我对索引不好,所以我尽可能尝试使用STL而不是数组

代码行int[] rangeArray = new int[0]实例化了一个长度为0的数组。您不能对此数组做任何事情!

由于我们知道起始数组( [2,8,7,3,4] ),因此我们知道了大小。 因此,将数组长度更改为5,因为我们将所有数字都添加到该数组中,所以所有项目都将满足边界条件),从而使代码行现在为int[] rangeArray = new int[5]

接下来,让我们看看您的循环。 我假设您要采用的路径是查看每个值,并查看它是否>=最小值,也<=最大值。 因此,我们应该设置第二个数组。 我们称它为boundaryArray 我们也将长度设为5,因为所有元素实际上都可以满足条件。 因此,我们有这行代码: int[] boundaryArray = new int[5] 因此,让我们遍历元素,看看是否有任何值匹配。 让我们看一下这段代码:

int minimum = 1;
int maximum = 5;
int counter = 0; 
for (int i = 0; i < rangeArray.length; i++)
{
  if (rangeArray[i] >= minimum && rangeArray[i] <= maximum
  {
    boundaryArray[counter] = rangeArray[i];
    counter++;
  }
}

我们首先初始化两个整数,我们的最小值和最大值(分别为1和5)。 接下来,我们有一个计数器,以跟踪添加了多少项。 然后,我们使用for循环遍历原始数组,并且每次循环都增加1。 然后,如果我们要查看的数字是> =最小值 <=最大值,则将数字添加到boundaryArray并增加计数器。

如果要打印列表,只需运行另一个从0到boundaryArray.length的for循环,并使用System.out.println(boundayArray[i].toString())打印出数组,其中i是for循环迭代变量。

这里有两个主要问题。 首先是您要初始化数组以使其包含0个元素,这意味着您永远无法对其进行任何操作。 表示int[] rangeArray = new int[0]应为:

int[] rangeArray = new int[a.length];

这表示您希望新数组与输入值一样大。 由于我们实质上是在过滤参数数组,因此它不应大于它,因此不会出现超出范围的错误。

现在下一部分,如果您是for循环。 您正在使用索引来过滤元素的值。 这不是您想要的。 相反,您要遍历数组的整个内容。 您可以使用这样的foreach循环,然后检查当前索引处的值是否在最小值和最大值之间。

int counter = 0;  //keep track of our spot in our new array
for(int i : a) //iterate over all the elements of a using int i as our iterator
{
   if(i >= min && i<= max) //check if it is within our allowed range
   {
       rangeArray[counter] = i; //add it to the new array
       counter++;               //increment counter to add to next spot in our new array
   }
}
public static int[] range(int[] a, int low, int high) {

    Arrays.sort(a); // sort the aray first

    int length = 0; // number of numbers within the range

    for (int i = 0; i < a.length; i++) { // check all ints in the array

        // if the int is in the range, add 1 to the length
        if (low <= a[i] && high >= a[i]) {
            length++;
        }
    }

    // determine array size with number of numbers found within the range
    int[] rangeArray = new int[length];

    for (int i = 0; i < a.length; i++) // for every int in the array
    {  
        if (low <= a[i] && high >= a[i]) // if number is between the range
        {
            rangeArray[i] = a[i]; // add it to the range array
        }
    }
    return rangeArray;
}

public static void main(String args[]) {
    int[] array = {2, 8, 7, 3, 4};
    int[] rangeArray = range(array, 1, 5);

    System.out.print( Arrays.toString(rangeArray) );
}

输出:

[2, 3, 4]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM