在数组中查找最接近的值并将其删除

时间:2017-11-05 21:37:35

标签: java collections

我已经通过几个类似的线程搜索了确切的问题,但是我无法让代码工作,我想在数组中找到最接近的值然后将其删除,这是我的代码:< / p>

import java.util.ArrayList;
import java.util.Scanner;
public class Entertrain {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        System.out.println("Power: ");
        int power = Integer.parseInt(console.nextLine());
        ArrayList<Integer> weight = new ArrayList<>();
        int averageWagon = 0;
        int sum = 0;

        while (console.hasNextInt()) {
            weight.add(console.nextInt());

        }

        for (int i = 0; i < weight.size(); i++)
            sum += weight.get(i);

        if (sum > power) {
            averageWagon = sum / weight.size();
            //Here I want to find the closest value to averageWagon

        }
        System.out.println(averageWagon);

        System.out.println(weight);
        System.out.println(power);
        System.out.println(sum);

    }
}

如果有可能引导我找到解决方案,我已经尝试了几个小时了,最后得出的结论是我严重缺乏阵列知识,所以无论如何我都会把它放在一边现在专注于数组,但感谢你对这个数组的帮助。

3 个答案:

答案 0 :(得分:2)

这不是您正在寻找的阵列,而是集合。您正在使用ArrayList,它实现了List。

public static void main(String[] args) {

    Scanner console = new Scanner(System.in);
    System.out.println("Power: ");
    int power = Integer.parseInt(console.nextLine());
    ArrayList<Integer> weight = new ArrayList<>();
    int averageWagon = 0;
    int sum = 0;

    while (console.hasNextInt()) {
        weight.add(console.nextInt());
    }

    for (int i = 0; i < weight.size(); i++)
        sum += weight.get(i);

    if (sum > power) {
        averageWagon = sum / weight.size();

        Integer closest = weight.get(0);
        for (Integer i: weight) {
             if (Math.abs(averageWagon - closest) > Math.abs(averageWagon - i))
                 closest = i;
        }
        weight.remove(closest);
    }
    System.out.println(averageWagon);

    System.out.println(weight);
    System.out.println(power);
    System.out.println(sum);
}

答案 1 :(得分:1)

你可以做这样的事情

public static void main(String[] args) {
    Scanner console = new Scanner(System.in);
    System.out.println("Power: ");
    int power = Integer.parseInt(console.nextLine());
    ArrayList<Integer> weight = new ArrayList<>();
    int averageWagon = 0;
    int sum = 0;

    while (console.hasNextInt()) {
        weight.add(console.nextInt());

    }

    for (int i = 0; i < weight.size(); i++) {
        sum += weight.get(i);
    }

    if (sum > power) {
        averageWagon = sum / weight.size();
        //Here I want to find the closest value to averageWagon
        int closest = findClosestNumber(averageWagon, weight);
        System.out.println("Closest number to average: "+ closest);

    }
    System.out.println(averageWagon);

    System.out.println(weight);
    System.out.println(power);
    System.out.println(sum);

}

static int findClosestNumber(int num, List<Integer> numbers) {
    int closest = numbers.get(0);

    for (int i : numbers) {
        if (Math.abs(num - i) < Math.abs(num - closest)) {
            closest = i;
        }
    }
    return closest;
}

答案 2 :(得分:0)

以下是使用流进行此操作的方法:

int sum = weight.stream().mapToInt(Integer::intValue).sum();

if (sum > power) {
    int avg = sum / weight.size(); // shouldn't it be double?
    weight.stream()
        .min((a, b) -> Integer.compare(Math.abs(a - avg), Math.abs(b - avg)))
        .ifPresent(weight::remove); // remove closest number from weight
}                                   // list if found (i.e. if list not empty)

首先使用流来查找总和,然后计算平均值,最后,Stream.min用于查找流的最小元素,即最接近平均值的元素。

Stream.min接收Comparator作为参数,它具有通常的比较器语义:如果第一个参数小于第二个参数,则返回负值;如果更大,则返回正值,否则(如果相等),返回零。在这种情况下,如果a与平均值的距离小于b到平均值的距离,则b小于Stream.min。在这里,我使用Integer.compare进行比较。

请注意,Optional<Integer>不会返回最小数字,而是weight。这是因为weight列表可能为空,因此在这种情况下,没有最小元素。这是Optional.ifPresent方法派上用场的时候:如果找到了最小值,那么我们会将其从while : do screen -S pvp java -Xms8G -jar spigots.jar nogui done 列表中删除,否则不会发生任何事情。