【问题标题】:How do I find the smallest value in an array of Complex numbers a + ci如何在复数数组a + ci中找到最小值
【发布时间】:2019-06-18 22:14:35
【问题描述】:

我正在尝试编写一种方法,该方法在复数 a + ci 的数组中找到最小值,其中 a 和 c 都是双精度数。 a 是实部,ci 是虚部。我试图让它通过数组并比较每个对象 a + ci 和 b + di。我将首先比较实部,如果实部相等,那么我将继续进行虚部,例如 complexNumberOne

到目前为止,我有一个方法可以确定数组中的最小数字,但只能通过比较实部:

import java.util.Scanner;
import java.util.Random;

private boolean arrayTest = false;

public double min(Complex[] arr) {
    double min = Double.MIN_VALUE;
    for(int i = 0; i < arr.length;i++) {
        if(arr[i].getReal() < min) {
            min = arr[i].getReal();
        }
    }
    return min;
}

但是我根据上述条件找到最小元素的方法似乎无济于事:

public Complex smallest(Complex[] arr) {

    Complex min = new Complex();

    for(int i = 0; i < arr.length;i++) {
        while(!arrayTest) {
            if(arr[i].getReal()<arr[i+1].getReal()) {
                arrayTest=true;
                min = arr[i];
            }else if(arr[i].getReal()==arr[i+1].getReal()) {
                while(!arrayTest) {
                    if(arr[i].getImaginary()<arr[i+1].getImaginary()) {
                        arrayTest=true;
                        min = arr[i];
                    }
                }
            }
        }
    }
    return min;
}

【问题讨论】:

  • 你需要double min = Double.MAX_VALUE;而不是double min = Double.MIN_VALUE;
  • while 围绕 if (arr[i].getimaginary() &lt; ... 循环是错误的。如果if 没有第一次将arrayTest 设置为true,则循环内不会发生任何变化,这可能会导致ifarrayTest 设置为true,所以你'有一个无限循环。对于初学者来说,也许只是摆脱那个while
  • 对于复数,这不是“小”的通常定义。复数不存在全序,但通常根据它们与原点的距离对它们进行部分排序,即 (r * r + i * i - 如果你不需要取平方根'只是比较)。

标签: java arrays random


【解决方案1】:

为什么会有这么多循环和嵌套循环?
对数组进行一次扫描即可:

public Complex smallest(Complex[] arr) {
    if (arr.length == 0) return null;

    Complex min = arr[0];

    for (int i = 1; i < arr.length; i++) {
        if (arr[i].getReal() < min.getReal()) {
            min = arr[i];
        } else if (arr[i].getReal() == min.getReal()) {
            if (arr[i].getImaginary() < min.getImaginary()) {
                min = arr[i];
            }
        }
    }
    return min;
}

也不需要那个布尔标志arrayTest
如果您不介意较长的条件,代码可以进一步简化

public Complex smallest(Complex[] arr) {
    if (arr.length == 0) return null;

    Complex min = arr[0];

    for (int i = 1; i < arr.length; i++) {
        if (arr[i].getReal() < min.getReal() || (arr[i].getReal() == min.getReal() && arr[i].getImaginary() < min.getImaginary())) {
            min = arr[i];
        }
    }
    return min;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2021-03-15
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多