【问题标题】:How to compare two arrays of different sizes?如何比较两个不同大小的数组?
【发布时间】:2016-02-24 16:30:56
【问题描述】:

所以我的任务是逐行读取文件并将整数存储到数组中。然后在点 1-5、2-6、3-7 等中添加整数并将它们存储到一个新数组中。

在数组 1 中,比数组 2 多 4 个值。我需要比较这些数组,看看数组 1 是否比数组 2 大 0.999。

如果确实更大,我需要打印出数组1中数字的LOCATION。

现在我的问题是我的代码输出的每个数字都大于数组 2 中的相应数字。

代码:

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

public class Asgn7
{
    public static void main(String[] args) throws FileNotFoundException
    {   
        Scanner file = new Scanner(new File("asgn7data.txt"));
        double[] array = new double[file.nextInt()];
        double[] newArray = new double[array.length - 4];
        double tempVal = 0;
        int j = 0;
        int count = 0;

        while(file.hasNext())
        {
        for(int i = 0; i < array.length ; i++)
        {
            array[i] = file.nextInt();
        }

        for(j = 0; j < array.length - 4; j++)
        {
            for(int k = 0; k < 5; k++)
            {
                newArray[j] += array[j+k] / 5;  
             }

        }

        for(int i = 2; i < array.length; i++)
        {
            if(array[i] > (newArray[i-2] + 0.999));
            {
                count++;
                tempVal = count;
            }

             System.out.println(tempVal);
        }   
        }

    }
}

应该比较的值是3-13。

【问题讨论】:

  • 不确定你的逻辑。 newArray 中的数字不是您指定的,而是运动 1-5 中五个数字的平均值,2-6 的平均值等。此外,您正在将 array 中的所有数字与一个进行比较,具体newArray 中的元素(元素j-2j 没有改变。你到底想通过这个实现什么?
  • 一般的事情,是对的,那是我的错。应该是 i-2 吗?
  • @RealSkeptic -> i=2 在那里,所以 array[i] 从第三个索引开始,并且 j-2 在那里,因为当我把 i-2 和 newArray[i- 2] 我得到一个越界错误
  • 所以现在的问题是,您到底想比较什么?为什么是第三个索引?由于数组的长度不同,当然你会得到一个越界错误。因此,请编辑您的问题并更好地解释哪些数字应检查在彼此之间的 0.999 范围内。
  • @RealSkeptic 我刚刚在原始帖子中添加了一张图片。具有两个数字的值应相互比较。灰色阴影的应该是返回真实的那些。

标签: java arrays


【解决方案1】:

通过查看您的代码,不清楚您在问题中要求什么,但没有质疑逻辑是什么:

    for(int i = 2; i < array.length; i++)
    {
        if(array[i] > (newArray[i-2] + 0.999));
        {
            count++;
            tempVal = count;
        }

         System.out.println(tempVal);
    }   
    }

如果你重新定位 system.out 行如下,我想你会得到你所期望的如下:

    for(int i = 2; i < array.length - 2; i++)
    {
        if(array[i] > (newArray[i-2] + 0.999));
        {
            System.out.println(tempVal);
            // count++;
            // tempVal = count;
        }


    }   
    }

PS:请注意,我还更改了循环的边界,以在数组的第 13 个成员上停止迭代,而不是 15 个。

【讨论】:

  • 打印出 (4,6,4,7,11,8,10,6,10,13,6) 这是它应该比较的数字,但它似乎无法识别何时newArray[1-2] 比它大。
【解决方案2】:

从图片来看,您没有将值放在第二个数组的正确索引中,或者您没有匹配正确的索引。

如果你想让它看起来和图片中的一模一样,应该声明第二个数组:

double[] newArray = new double[array.length - 2];

并且填充它的循环应该更改为:

    for(j = 2; j < array.length - 2; j++)
    {
        for(int k = -2; k <= 2; k++)
        {
            newArray[j] += array[j+k] / 5;  
        }

    }

这会将平均值放在newArray 中的第三个、第四个、第五个...元素中。现在您可以直接比较它们:

    for(int i = 2; i < array.length - 2; i++)
    {
        if(array[i] > (newArray[i] + 0.999))
        {
            count++;
            tempVal = count;
        }

        System.out.println(tempVal);
    }

如果您想像最初那样保存两个未使用的空间,而不是完全响应图片,那么您应该像最初那样计算值。但请记住将每个元素与它之前的两个位置进行比较并在结束前停止 2 个位置

代替

for(int i = 2; i < array.length; i++)

使用

for(int i = 2; i < array.length - 2; i++)

要打印位置,您不需要使用counttempVal 构造。您只需要打印i+1。另请注意,您的if 后面有一个;。这意味着它是一个空的if,并且总是执行它之后的块。在ifforwhile 等之后永远不要有;

【讨论】:

  • 我把代码改成了你的,现在从 1-11 打印出来。有什么建议吗?
  • @JonRoy 我编辑了我的答案。以前我只是复制了你的代码。但是那个代码是错误的。
  • 天哪,原来是;让我的回答完全错误?谢谢老兄,现在效果很好。
【解决方案3】:

您确定正确解析了数字吗? 见Java: Reading integers from a file into an array 解析验证后为什么不打印出来?

顺便说一句,这将溢出第二个数组的索引(因为它是使用 new double[array.length - 4] 创建的):

for(int i = 2; i < array.length; i++)

你的代码运行了吗?

【讨论】:

  • 它正在正确打印数字,是的,它确实运行了
  • 这对我来说听起来不合逻辑 - 它应该引发异常,因为第二个数组上的索引将超出范围:newArray[i-2] when i=array.length-1 (请参阅最后一个 for 循环)将是 newArray[array.length-1-2] aka newArray[array.length-3] 但您将 newArray 定义为具有 array.length-4 个元素,因此其中的最大索引应该是 array.length -5 比 array.length-3 低两个位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多