gpt4 book ai didi

java - 如何删除值,确定剩余值的最小值

转载 作者:行者123 更新时间:2023-11-30 08:38:17 25 4
gpt4 key购买 nike

我需要在删除第一个值后确定最小值。

例如这些是数字 0.5 70 80 90 10

我需要删除 0.5,以确定剩余数字中的最小值。 calweightAvg 是我的重点......

最终输出应该是“数字的加权平均值为 40,当使用数据 0.5 70 80 90 10 时,其中 0.5 是权重,并且平均值是在丢弃其余值中的最低值后计算的。 ”

编辑:除了最终输出期间,一切似乎都正常。 "数字的加权平均值为40.0,当使用数据70.0、80.0、90.0、10.0时,其中70.0(应为0.5)为权重,去掉最低的后计算平均值其余的值。”

所以数学是正确的,输出是错误的。

编辑:在使用类 static double weight=0.5; 建立权重时,如果用户要更改输入文件中的值,那将不起作用。如何更改类(class)?

/*
*
*/
package calcweightedavg;
import java.util.Scanner;
import java.util.ArrayList;

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.io.IOException;


public class CalcWeightedAvg {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {

//System.out.println(System.getProperty("user.dir"));
ArrayList<Double> inputValues = getData(); // User entered integers.
double weightedAvg = calcWeightedAvg(inputValues); // User entered weight.
printResults(inputValues, weightedAvg); //Weighted average of integers.

}

public class CalcWeightedAvg {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {

//System.out.println(System.getProperty("user.dir"));
ArrayList<Double> inputValues = getData(); // User entered integers.
double weightedAvg = calcWeightedAvg(inputValues); // User entered weight.
printResults(inputValues, weightedAvg); //Weighted average of integers.

}

public static ArrayList<Double> getData() throws FileNotFoundException {

// Get input file name.
Scanner console = new Scanner(System.in);
System.out.print("Input File: ");
String inputFileName = console.next();
File inputFile = new File(inputFileName);

//
Scanner in = new Scanner(inputFile);
String inputString = in.nextLine();

//
String[] strArray = inputString.split("\\s+"); //LEFT OFF HERE

// Create arraylist with integers.
ArrayList<Double> doubleArrayList = new ArrayList<>();
for (String strElement : strArray) {
doubleArrayList.add(Double.parseDouble(strElement));
}

in.close();

return doubleArrayList;
}


public static double calcWeightedAvg(ArrayList<Double> inputValues){
//Get and remove weight.
Double weight = inputValues.get(0);
inputValues.remove(0);

//Sum and find min.
double min = Double.MAX_VALUE;
double sum = 0;
for (Double d : inputValues) {
if (d < min) min = d;
sum += d;
}

// Calculate weighted average.
return (sum-min)/(inputValues.size()-1) * weight;


}

public static void printResults(ArrayList<Double> inputValues, double weightedAvg) throws IOException {
Scanner console = new Scanner(System.in);
System.out.print("Output File: ");
String outputFileName = console.next();
PrintWriter out = new PrintWriter(outputFileName);

System.out.println("Your output is in the file " + outputFileName);

out.print("The weighted average of the numbers is " + weightedAvg + ", ");
out.print("when using the data ");
for (int i=0; i<inputValues.size(); i++) {
out.print(inputValues.get(i) + ", ");
}
out.print("\n where " + inputValues.get(0) + " is the weight, ");
out.print("and the average is computed after dropping the lowest of the rest of the values.\n");

out.close();
}

最佳答案

在复杂度为 O(n) 的情况下完成这项任务并不是一项艰巨的任务。您可以使用 ArrayList.get(0) 将权重保存在临时变量中,然后使用 .remove(0) 函数删除第一个值(在本例中为 0.5)

那么你应该使用 For Each 循环 for (Double d : list) 求和并找到最小值

然后从总和中减去最小值。并对总和施加权重(在这种情况下,您最终会得到 240*0.5 = 120; 120\3 = 40;

最后,您可以使用ArrayList.size()-1 函数来确定除数。

您的代码中的问题:

  • 在您的实现中,您已经从列表中删除了重量项。然后乘以列表中的第一项,即使它不再是权重:

return (sum-min)/(inputValues.size()-1) * inputValues.get(0);

  • 你的计算结果是:((70+80+90+10)-10)/(4-1) * (70) = 5600
if(inputValues.size() <= 1){
inputValues.remove(0);
}
  • 此尺寸保障不会消除列表中的重量。也许你打算使用 >=1
  • 即使这是您的意图,这也不会导致在 size==0\1\2 的边缘情况下正确计算您的算法,我建议您重新考虑这一点。

抽象代码中需要走的全部步骤:

ArrayList<Double> list = new ArrayList();
// get and remove weight
Double weight = list.get(0);
list.remove(0);
// sum and find min
double min=Double.MAX_VALUE;
double sum=0;
for (Double d : list) {
if (d<min) min = d;
sum+=d;
}
// subtract min value from sum
sum-=min;
// apply weight
sum*=weight;
// calc weighted avg
double avg = sum/list.size()-1;
// viola!

请注意,您现在可以通过 ArrayList.add(int index, T value) 函数安全地将权重添加回数组列表。此外,代码非常抽象,应实现有关大小的保护措施。

关于您的编辑:

看来您正在输出错误的变量。

out.print("\n where " + inputValues.get(0) + " is the weight, ");

权重变量在这个阶段已经从列表中删除,所以列表中的第一项确实是 70。要么在计算结果后将权重变量添加回列表中,要么将其保存在类变量中并直接输入。

以下是两种方案的实现。你应该只使用其中之一,而不是两者。

1) 将权重添加回列表解决方案:

更改此函数以将权重添加回列表:

public static double calcWeightedAvg(ArrayList<Double> inputValues){
//Get and remove weight.
Double weight = inputValues.get(0);
inputValues.remove(0);

//Sum and find min.
double min = Double.MAX_VALUE;
double sum = 0;
for (Double d : inputValues) {
if (d < min) min = d;
sum += d;
}
// Calculate weighted average.
double returnVal = (sum-min)/(inputValues.size()-1) * weight;
// add weight back to list
inputValues.add(0,weight);

return returnVal;
}

2)类变量解法:

类(class)变化:

public class CalcWeightedAvg { 

static double weight=0;
//...
}

功能改变:

public static double calcWeightedAvg(ArrayList<Double> inputValues){
//Get and remove weight.
weight = inputValues.get(0); // changed to class variable
//...
}

改变输出:

out.print("\n where " + weight + " is the weight, ");

关于java - 如何删除值,确定剩余值的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36672353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com