如何过滤数组中的正方形

时间:2019-05-09 16:46:02

标签: java arrays

我是Java编码的新手,我需要一些帮助。

我需要一种方法来过滤数组中的平方数,例如(4、9、16、25),然后将它们保存到新数组中而不替换旧数组。

不幸的是,我没有办法:/。

这是我自己的一些想法:

public static int[] arrayFilter(int originalArray[]) {
    int[] filterArray = generateCopy(originalArray);
    for(int index = 0; index < filterArray.length; index++) {

        }
    }

}

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

这是怎么回事,请遍历数组并检查平方根的平方与原始数字相同。如果是这样,则将其添加到列表中,完成后将其转换为数组。

int[] numbers = new int[] { 1,2,3,4,5,6,7,8,9,10 };
List<Integer> resultList = new ArrayList<>();
for (int number: numbers) {
    int sqrRoot = (int) Math.round(Math.sqrt(number));
    if (sqrRoot * sqrRoot == number) {
        resultList.add(number);
    }
}

或者如果您不能使用List(请参阅下面原始问题作者的评论)...

int[] numbers = new int[] { 1,2,3,4,5,6,7,8,9,10 };
int[] initResult = new int[numbers.length];
int numSquares = 0;
for (int i = 0; i < numbers.length; i++) {
    int sqrRoot = (int) Math.round(Math.sqrt(numbers[i]));
    if (sqrRoot * sqrRoot == numbers[i]) {
        initResult[numSquares] = numbers[i];
        numSquares++;
    }
}
int[] result = new int[numSquares];
for (int i = 0; i < numSquares; i++) {
    result[i] = initResult[i];
}

我按照(int) Math.round(Math.sqrt(numbers[i]))计算平方根的原因是为了防止floating point arithmetic问题。这样,整数4的平方根将始终是值为2的整数。

答案 1 :(得分:-1)

下面是使用带过滤器的Streams创建新输出数组的示例。

public class Squares {
    public static void main(String... args) {
        double[] numbers = {1, 2, 3, 4, 4.4, 100, 2500, 2500.1};
        double[] squares = Arrays.stream(numbers)
                .filter(Squares::isSquare)
                .toArray();
        System.out.println(Arrays.toString(squares));
    }

    private static boolean isSquare(double d) {
        double sr = Math.sqrt(d);
        return sr - Math.floor(sr) == 0;
    }
}