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