我已经通过几个类似的线程搜索了确切的问题,但是我无法让代码工作,我想在数组中找到最接近的值然后将其删除,这是我的代码:< / 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);
}
}
如果有可能引导我找到解决方案,我已经尝试了几个小时了,最后得出的结论是我严重缺乏阵列知识,所以无论如何我都会把它放在一边现在专注于数组,但感谢你对这个数组的帮助。
答案 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
列表中删除,否则不会发生任何事情。