【问题标题】:How to find the location of maximum and minimum value of a 2d array如何找到二维数组的最大值和最小值的位置
【发布时间】:2017-02-13 04:20:39
【问题描述】:

我不知道我是否清楚这一点,但我已经正确打印出最小值和最大值,但我似乎无法弄清楚如何说出它们所在的确切行和列。 这就是我到目前为止所拥有的;

double max = m[0][0];
       double min =  m[0][0];
    System.out.println("The matrix is : ");

        for(int i = 0; i < m.length; i++)
        {
            for ( int j = 0; j < m[i].length; j++ )
            {
                System.out.printf("   " + "%6.1f " , m[i][j]);
                if (m[i][j] > max)
                    max = m [i][j];     

                else if
                (m[i][j] < min)
                    min = m [i][j];

我如何发表声明说明他们的位置?例如:(“最大数量在第 1 行,第 2 列”)类似的东西...... 非常感谢任何帮助

【问题讨论】:

  • 当你做max = m[i][j]时,也存储位置。所以在顶部,有double max = m[0][0]; int x = 0; int y = 0;,其中xy 是坐标。所以在max = m[i][j] 下,你写x = i; y = j;
  • 一般来说,存储最大值和最小值的最佳方式是在将值输入到数组时保留“运行”最大值和最小值的标签,如果您可以选择的话。您没有展示如何将值输入到数组中,所以我不知道您是在控制它还是它是外力。如果您将值输入到数组中,那么考虑到您已经有能力事先知道该信息,那么在事后尝试搜索它是不必要且浪费的。

标签: java arrays loops multidimensional-array max


【解决方案1】:

参见下面的修改。我添加了变量来跟踪最小值和最大值的索引。在循环结束时,您可以简单地打印出 maxIndex1maxIndex2minIndex1minIndex2

double max = m[0][0];
double min =  m[0][0];

//declare variables to track the indices of the min and max
int maxIndex1 = -1;
int maxIndex2 = -1;
int minIndex1 = -1;
int minIndex2 = -1;

System.out.println("The matrix is : ");
for(int i = 0; i < m.length; i++)
{
    for ( int j = 0; j < m[i].length; j++ )
    {
        System.out.printf("   " + "%6.1f " , m[i][j]);
        if (m[i][j] > max)
        {
            max = m [i][j]; 
            //record the indices of the new max
            maxIndex1 = i;
            maxIndex2 = j;  
        }  
        else if (m[i][j] < min)
        {
            min = m [i][j];
            //record the indices of the new min
            minIndex1 = i;
            minIndex2 = j;
        }

请注意,如果您有两个相等的值并且与数组中的最大值相关联,则只会记录两者中的一个。如果您想记录所有关系的最小/最大位置,您可以将其更改为保存坐标列表而不是单个坐标。

【讨论】:

  • 值得注意的是,这仅适用于矩阵中的最大值和最小值唯一的情况,因为您只存储一个位置。
  • 如果你有一个排序数组,你可以从else if 中删除else
  • @Gendarme 我认为这个例子可以满足 OP 的需求,但绝对值得注意。我编辑了我的帖子以包含它。
  • 致 OP:考虑跨多个并行线程执行数组的第一个维度,以减少查找最小值和最大值所需的时间
  • @searchengine27 如果有问题的数组非常大,这不是一个坏主意。如果它们是正常大小,则无需进行此优化。
【解决方案2】:

这很容易!只需声明另外 2 个变量来存储您的 x 和 y 坐标。并在 if 和 else 中更新它们(不要忘记在 if 和 else 子句中添加花括号!),你就拥有了它们!

【讨论】:

  • 这种情况下不需要大括号。
  • 根据 Java 规范,if 语句的文字语法是 if ParExpression Statement [else Statement],其中 Statement 是一个块或单行语句。我同意,花括号是不必要的,纯粹是可选的和个人喜好。
  • 所以,你是说这样没问题?!如果 (m[i][j] > max) max = m [i][j];最大索引1=我; maxIndex2=j;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2019-03-31
  • 2017-03-16
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多