通过在java中规范化来调整列表



在分析数据集时,例如身高或体重的数据,一个常见的步骤是调整数据。这种调整可以通过归一化到0和1之间的值来完成,或者丢弃异常值。

对于该程序,通过将所有值除以最大值来调整值。输入以一个整数开始,该整数指示后面的浮点值的数目。假设列表中始终包含少于20个浮点值。

输出每个浮点值,小数点后有两位数字,可以实现如下:

System.out.printf("%.2f", yourValue);

例如:如果输入为:

5 30.0 50.0 10.0 100.0 65.0

输出为:

0.30 0.50 0.10 1.00 0.65

5表示列表中有五个浮点值,即30.0、50.0、10.0、100.0和65.0。100.0是列表中的最大值,因此每个值都除以100.0。

为了简化编码,在每个输出值后面加一个空格,包括最后一个。

这是我迄今为止的代码:

import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
double numElements;
numElements = scnr.nextDouble();
double[] userList = new double[numElements];
int i;
double maxValue;
for (i = 0; i < userList.length; ++i) {
userList[i] = scnr.nextDouble();
}
maxValue = userList[i];
for (i = 0; i < userList.length; ++i) {
if (userList[i] > maxValue) {
maxValue = userList[i];
}
}
for (i = 0; i < userList.length; ++i) {
userList[i] = userList[i] / maxValue;
System.out.print(userList[i] + " ");
System.out.printf("%.2f", userList[i]);
}
}
}

我一直得到这个输出。

LabProgram.java:8: error: incompatible types: possible lossy conversion from double to int
double [] userList = new double [numElements]; 
^
1 error

我觉得我的变量搞砸了。我通读了我的书,找不到帮助。有人能帮我一下吗。非常感谢!这对我来说压力很大。

特定的错误消息是因为元素的索引和大小必须是int。因此,立即声明并分配:int numElements = scnr.nextInt();

更好的编程方式:

  • 跳过手动输入(也称为扫描仪和配偶(。让你疯狂,测试速度慢了10万倍
  • 方法完成后,您可以稍后集成交互式部分。你已经知道怎么做了,你的代码已经显示出来了
  • 用明确的方法来做你的工作。不要把所有东西都放在主方法中。通过这种方式,您可以在该方法上运行多个示例/测试,并为以后提供更好的实现
  • 在您实现的方法内部检查无效输入。一旦你可以依赖这样的方法,你以后就可以继续使用它
  • 您甚至可以将示例编号移动到它自己的测试方法中,这样您就可以运行多个测试方法。稍后您将了解单元测试

示例代码:

public class LabProgram {

public static void main(final String[] args) {
final double[] initialValues = new double[] { 30.0, 50.0, 10.0, 100.0, 65.0 };
final double[] adjustedValues = normalizeValuesByHighest(initialValues);
System.out.println("Adjusted values:");
for (final double d : adjustedValues) {
System.out.printf("%.2f ", Double.valueOf(d));
}
// expected otuput is 0.30 0.50 0.10 1.00 0.65
System.out.println();
System.out.println("All done.");
}

static public double[] normalizeValuesByHighest(final double[] pInitialValues) {
if (pInitialValues == null) throw new IllegalArgumentException("Invalid double[] given!");
if (pInitialValues.length < 1) throw new IllegalArgumentException("double[] given contains no elements!");
// detect valid max value
double tempMaxValue = -Double.MAX_VALUE;
boolean hasValues = false;
for (final double d : pInitialValues) {
if (Double.isNaN(d)) continue;
tempMaxValue = Math.max(tempMaxValue, d);
hasValues = true;
}
if (!hasValues) throw new IllegalArgumentException("double[] given contains no valid elements, only NaNs!");
// create return array
final double maxValue = tempMaxValue; // final from here on
final double[] ret = new double[pInitialValues.length];
for (int i = 0; i < pInitialValues.length; i++) {
ret[i] = pInitialValues[i] / maxValue; // NaN will stay NaN
}
return ret;
}

}

输出:

Adjusted values:
0,30 0,50 0,10 1,00 0,65 
All done.

最新更新