如何在java中找到Array中最接近的较小和较大的数字?

时间:2017-05-23 00:00:23

标签: java arrays

如何找到Array中最接近的较小和较大的数字?

我有数字列表:

[3.4, 5.8, 1.2, 7.9, 9.6, 2.7, 6.2, 4.7, 0.6, 4.1] 

我希望从数组中找到小于5.0的大小。在这种情况下,我想要最近的较小数字,即4.7,最接近5.8到5.0。

没有排序可能吗?因为我必须要数组。在一个数组中,我有x轴值,在另一个数组中,我有yAxis值。如果我对数组进行排序,那么我将无法获得x的相应y值。

3 个答案:

答案 0 :(得分:0)

一旦你正确定义了"最接近"你可以解决这个问题:当a(sub i i 的值最接近值v sub> -v)索引i在数组的所有元素中都是最小的。

使用Math.abs(x)计算绝对值。存储最小的一个,以及产生它的元素的索引。

对v。

以上和以下的值单独执行此操作

答案 1 :(得分:0)

考虑到你真的想要一个由两个数组值构建的坐标,这会使用Guava的Zip功能来压缩两个数据流。我们需要进行一些排序,但由于我们要对坐标而不是实际数组进行排序,因此您仍然可以获得您之后的最终坐标。

import com.google.common.collect.Streams;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;


public class ZipTest {

    public static void main(String[] args) {
        Double[] xCoordinates = {3.4, 5.8, 1.2, 7.9, 9.6, 2.7, 6.2, 4.7, 0.6, 4.1};
        Double[] yCoordinates = {4.3, 8.5, 2.1, 9.7, 6.9, 7.2, 2.6, 7.4, 6.0, 1.4};
        List<Double> xValues = Arrays.asList(xCoordinates);
        List<Double> yValues = Arrays.asList(yCoordinates);

       // Get coordinate whose x value is less than and closest to 5.0
       Optional<Coordinate> coord1 = getCoords(xValues, yValues)
               .filter(coord -> coord.x < 5.0)
               .sorted((c1, c2) -> Double.compare(c2.x, c1.x))
               .findFirst();
        System.out.println(coord1);

       // Get coordinate whose x value is greater than and closest to 5.0
       Optional<Coordinate> coord2 = getCoords(xValues, yValues)
               .filter(coord -> coord.x > 5.0)
               .sorted((c1, c2) -> Double.compare(c1.x, c2.x))
               .findFirst();
        System.out.println(coord2);
    }

    private static Stream<Coordinate> getCoords(List<Double> xValues, List<Double> yValues) {
        return Streams.zip(xValues.stream(), yValues.stream(), (x,y) -> new Coordinate(x,y));
    }

    private static class Coordinate {
        private final Double x;
        private final Double y;

        Coordinate(Double x, Double y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return "(" + x + "," + y + ")";
        }
    }
}

答案 2 :(得分:0)

排序可能是最简单的方法,如果你想维护它们的原始索引,你可以简单地将两个列表合并成对,或者创建一个类似(键,索引)的元组列表。通过这种方式,您可以按键排序并仍然保持对原始索引的了解,未来的查找速度会明显加快(假设您不止一次进行此检查)