Java - 查找LinkedList中最近的节点

时间:2018-05-07 17:07:06

标签: java

我正在尝试在Java中找到LinkedList中最接近的数字。我想出了对LinkedList进行排序的代码(在我的例子中填充了0-300的随机数),然后遍历循环,将整数“最接近”设置为排序列表中最接近的前一个数字。但是,当最接近的数字大于起始数字但是比前一个数字更接近时,我遇到了一个问题,因为我的代码没有检查更大的数字是否更接近。我如何检查更高的数字是否比上一个数字更接近?

如果答案很清楚,我很抱歉,我对Java很陌生,而且我一直试图解决这个问题,因为我的思绪一直空白。我假设答案与两者之间的差异的绝对值有关,但我很难过。

LinkedList<Integer> list = new LinkedList<Integer>();

int starting = number.nextInt(300);
int nearest = 0;

Collections.sort(list);

for (int i = 0; i < list.size(); i++)
{
    if (list.get(i) <= starting)
    {
        nearest = list.get(i);
    }
}

System.out.print("The closest element of the list is " + nearest + ".");

3 个答案:

答案 0 :(得分:1)

您无需对数字进行排序即可找到最接近目标的数字。只需搜索与您的目标最接近的绝对差异。这是Java 8的单行代码:

Integer result = integers
    .stream()
    .min(Comparator.comparing(x -> Math.abs(x - goal)))
    .orElse(null);

这基本上是O(n)。排序通常类似O(n*log n),所以除非你需要为其他目的排序数组,否则从时间复杂度POV排序是不合理的。

答案 1 :(得分:0)

您可以存储任何数字与起始数字之间找到的最低差异(到目前为止)。这可以通过使用Math.abs获取两个数字之间的绝对值来完成。

您可以根据最低差异选择最接近的数字。

int diff = Integer.MAX_VALUE;

for (int i = 0; i < list.size(); i++) {
    if (Math.abs(starting - list.get(i)) < diff) {
        nearest = list.get(i);
        diff = Math.abs(starting - list.get(i));
    }
}

System.out.print("The closest element of the list is " + nearest + ".");

如果有两种可能的选择,这将选择较低的数字。

示例: [9,10,11],你从10开始,这将选择9。

要选择11,只需在<条件中将<=更改为if

答案 2 :(得分:0)

假设您找到了与starting值最接近的值。

您无需对列表进行排序。

试试这个:

int nearest = 0;
int distance = Integer.MAX_VALUE;

for (int i : list) {
  int d = Math.abs(i - starting);
  if (d < distance) {
    nearest = i;
    distance = d;
  }
}

System.out.print("The closest element of the list is " + nearest + ".");