[英]Java help needed
Ok, I am very close to the solution but I just can not figure this out. 好的,我非常接近解决方案,但是我无法弄清楚。 For some reason my code is not generating random ages, heights, weights etc. Additionally, I am getting an error "non static method getBodyMassIndex() can not be referenced from static context lines 43 & 45. I have done research and read that the error is because I need to create an instance to apply this to but I am lost. I thought I had already done that and I can't get anything to work. This is basically a self-taught java course and I'm really struggling. Any help greatly appreciated!! Code follows: 由于某些原因,我的代码无法生成随机的年龄,身高,体重等。此外,我收到一个错误消息“无法从静态上下文行43和45引用非静态方法getBodyMassIndex()。错误是因为我需要创建一个实例以将其应用到该对象,但我迷路了。我以为我已经做完了,什么也无法做,这基本上是一门自学的Java课程,我真的很努力任何帮助,不胜感激!!代码如下:
package classlab3b;
import classlab3B.BodyMassIndex;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;
/**
*
* @author ccity
*/
public class ClassLab3B {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("Please enter the number of people:");
//asks user to input number of people
int numberOfPeople;
//declares integer variable for number of people
Scanner input = new Scanner(System.in);
//creates system input scanner
numberOfPeople = input.nextInt();
//captures user input for number of people
BodyMassIndex[] a = new BodyMassIndex[numberOfPeople];
//creates an array of BodyMassIndex the size of numberOfPeople
String name = loadRandomNames(a);
//loads object with random name
int age = loadRandomAges(a, numberOfPeople);
//loads object with random age
double weight = loadRandomWeights(a);
//loads object with random weight
double height = loadRandomHeights(a);
//loads object with random height
createObjectsToFillArray(a, name, age, weight, height, numberOfPeople);
//creates "x" objects to fill the array
double BMI = BodyMassIndex.getBodyMassIndex();
//gets BMI from getBodyMassIndex method in BodyMassIndex.java
String status = BodyMassIndex.getStatus();
//gets status from getStatus method in BodyMassIndex.java
//double BMI = BodyMassIndex.bmix.getBodyMassIndex();
//String status = BodyMassIndex.bmix.getStatus();
printArray(a, name, age, weight, height, BMI, status);
//prints array
System.out.println(" ");
System.out.println("Current Population");
System.out.println(" ");
System.out.println("Obese: " + BodyMassIndex.numberOfObese);
System.out.println("Overweight: " + BodyMassIndex.numberOfOverweight);
System.out.println("Normal: " + BodyMassIndex.numberOfNormal);
System.out.println("Underweight: " + BodyMassIndex.numberOfUnderweight);
System.out.println("================");
System.out.println("Total: " + BodyMassIndex.totalNumberOfPeople);
}
public static void createObjectsToFillArray(BodyMassIndex[] data, String name, int age, double weight, double height, int numberOfPeople) {
for (int i = 0; i < numberOfPeople; i++) {
data[i] = new BodyMassIndex(name, age, weight, height);
}
//creates new BodyMassIndex objects with generated variables from methods within
}
public static String loadRandomNames(BodyMassIndex[] data) {
String[] arrayOfFirstNames = {"Joe", "Donna", "Ronald", "Sarah", "David", "Courtney", "Irwin", "Linda", "Michael", "Cindy", "Tom", "Rebekah", "Todd", "Tracy", "Peter", "Nicole", "Marcelo", "Jennifer", "Rick", "Andrea", "Bruce", "Jaclyn", "Doug", "Shirley", "Steve", "Liz", "Waldo", "Theresa", "Scott", "Colby", "Beth", "Larry", "Emily", "Paul", "Kate", "Sam", "Dianne", "Dustin", "Alethea", "Wayne", "Kristina", "Christian", "Danny", "Breya", "Andrew", "Alison", "Tim", "Mary", "Chris", "Susie", "Jeremy", "Willy", "Jessica", "Marcus", "Kelly", "Kyle", "Stephanie", "Isaiah", "Hillary", "Eric", "Julia", "Donald", "Meredith", "Kevin", "Leslie", "Blake", "Angela", "Cliff", "Debbie", "Dylan", "Erin", "Alex", "Monica", "Nathan", "Wendy", "Josh", "Megan", "Adam", "Michelle", "Carey", "Ashley", "Brian", "Jason", "Melanie", "Jim", "Monica", "Jamie", "Rhonda", "Steven", "Perry", "Byron", "Laura", "Harry", "Brooke", "Drew", "Vicki", "Gary", "Anita", "Felipe", "Josie"};
String[] arrayOfLastNames = {"Smith", "Johnson", "Williams", "Jones", "Brown", "Davis", "Miller", "Wilson", "Moore", "Taylor", "Washington", "Jefferson", "Lincoln", "Hamilton", "Jackson", "Grant", "Franklin", "McKinley", "Cleveland", "Madison", "Chase", "Nicholson", "Fauver", "Doe", "Southard", "Schmidt", "Hodson", "McDonald", "Stickley", "Miller", "Combs", "Bohus", "Krippner", "Amtower", "Banks", "Wallace", "Bannister", "Dehaven", "Yost", "Still", "Timbrook", "Peters", "Vaught", "Shellhammer", "Andrews", "Krippner", "McAlister", "Wright", "Kensinger", "McClellan", "Ganoe", "Shiley", "Layman", "Gearhart", "Yost", "Kushnir", "Bush", "Lowder", "Connolly", "Lowman", "Terveen", "Staton", "Settle", "Tinsman", "Nichols", "Baker", "Walters", "Dawe", "Renner", "Michaels", "Faircloth", "Looker", "Hastings", "Vaughan", "Anderson", "Zimmerman", "Deere", "Daher", "Lauck", "Stottlemyer", "Clinton", "Obama", "Reagan", "Montgomery", "Pugh", "Gavis", "Clark", "Bowers"};
String first = get(arrayOfFirstNames);
String last = get(arrayOfLastNames);
String name = first + " " + last;
return name;
}
public static String get(String[] array) {
Random generator = new Random();
int rnd = generator.nextInt(array.length);
return array[rnd];
}
public static int loadRandomAges(BodyMassIndex[] data, int numberOfPeople) {
double min = 13;
double max = 99;
int age = 0;
for (int i = 0; i < numberOfPeople; i++) {
age = (int) randomInt(min, max);
}
return age;
}
public static double randomInt(double min, double max) {
double random = (double) ((max - min + 1) * Math.random() + min);
return random;
}
public static double loadRandomWeights(BodyMassIndex[] data) {
double min = 100;
double max = 300;
double weight = randomInt(min, max);
for (int row = 0; row < data.length; row++) {
}
return weight;
}
public static double loadRandomHeights(BodyMassIndex[] data) {
double min = 55;
double max = 80;
double height = randomInt(min, max);
for (int row = 0; row < data.length; row++) {
}
return height;
}
public static void printArray(BodyMassIndex[] data, String name, int age, double weight, double height, double BMI, String status) {
System.out.println(" Name " + "Age " + "Height " + "Weight " + "BMI " + "Status");
for (int i = 0; i < data.length; i++) {
DecimalFormat format = new DecimalFormat();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
System.out.println(name + " " + age + " " + format.format(height) + " " + format.format(weight) + format.format(BMI) + " " + status);
}
}
}
And here's the BodyMassIndex.java code: 这是BodyMassIndex.java代码:
package classlab3B;
/**
*
* @author Liz
*/
public class BodyMassIndex {
private String name;
private int age;
private double weight;
private double height;
public static final double OBESE_BMI = 30.0;
public static final double OVERWEIGHT_BMI = 25.0;
public static final double NORMAL_BMI = 18.5;
public static int numberOfObese;
public static int numberOfOverweight;
public static int numberOfNormal;
public static int numberOfUnderweight;
public static int totalNumberOfPeople;
public static void main(String[] args) {
BodyMassIndex bmi1 = new BodyMassIndex("John Doe", 18, 145, 70);
//BodyMassIndex bmix = new BodyMassIndex(ClassLab3B.name, ClassLab3B.age, ClassLab3B.weight, ClassLab3B.height);
System.out.println("The BMI for " + bmi1.getName() + " is " + bmi1.getBodyMassIndex() + " " + bmi1.getStatus());
System.out.println(" ");
System.out.println(" ");
System.out.println("Current Population");
System.out.println(" ");
System.out.println("Obese: " + numberOfObese);
System.out.println("Overweight: " + numberOfOverweight);
System.out.println("Normal: " + numberOfNormal);
System.out.println("Underweight: " + numberOfUnderweight);
System.out.println("================");
System.out.println("Total: " + totalNumberOfPeople);
}
public BodyMassIndex(String name, int age, double weight, double height) {
this.name = name;
this.age = age;
this.weight = weight;
this.height = height;
totalNumberOfPeople++;
}
public double getBodyMassIndex() {
double bmi = ((weight * 703) / (height * height));
return Math.round(bmi * 100) / 100.0;
}
public String getStatus() {
double bmi = getBodyMassIndex();
if (bmi < 16) {
numberOfUnderweight++;
return "seriously underweight";
} else if (bmi < 18) {
numberOfUnderweight++;
return "underweight";
} else if (bmi < 24) {
numberOfNormal++;
return "normal weight";
} else if (bmi < 29) {
numberOfOverweight++;
return "overweight";
} else if (bmi < 35) {
numberOfObese++;
return "grossly overweight";
} else {
numberOfObese++;
return "gravely overweight";
}
}
@Override
public String toString() {
return "BodyMassIndex{" + "name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + '}';
}
public String getName() {
return name;
}
}
double BMI = BodyMassIndex. 双BMI = BodyMassIndex。 getBodyMassIndex() ; getBodyMassIndex() ; String status = BodyMassIndex. 字符串状态= BodyMassIndex。 getStatus() ; getStatus() ;
what are doing in this 2 methods you have create this 2 methods as non static but calling using class name. 这2个方法的作用是,您已将这2个方法创建为非静态方法,但使用类名进行了调用。 If you create these 2 method as static then in this 2 mehod you are using non static variable too. 如果您将这2个方法创建为静态方法,则在这2个方法中,您也使用了非静态变量。
double []BMI=new double[numberOfPeople] ; double [] BMI = new double [numberOfPeople];
String []status=new String[numberOfPeople] ; String [] status = new String [numberOfPeople];
for(int i=0;i<=numberOfPeople-1;i++) { for(int i = 0; i <= numberOfPeople-1; i ++){
BMI[i]=a[i].getBodyMassIndex(); BMI [i] = a [i] .getBodyMassIndex();
status[i]=a[i].getStatus(); status [i] = a [i] .getStatus();
} }
public static void printArray(BodyMassIndex[] data, String name, int age, double weight, double height, double[] BMI, String[] status) 公共静态无效printArray(BodyMassIndex []数据,字符串名称,整数年龄,双倍权重,双倍高度,双倍[] BMI,字符串[]状态)
public double getBodyMassIndex()
as static
- you do not really need an instance of BodyMassIndex
to call the method since you do not use any member data inside. 您需要将public double getBodyMassIndex()
标记为static
-您实际上不需要BodyMassIndex
实例来调用该方法,因为您内部没有使用任何成员数据。 So, the signature of this method should be: 因此,此方法的签名应为:
public static double getBodyMassIndex() {...}
The standard pattern to get Integer inside some range is: 使Integer处于某个范围内的标准模式是:
Min + (int)(Math.random() * ((Max - Min) + 1)) 最小值+(整数)(Math.random()*((最大值-最小值)+ 1))
The java Math
library function Math.random()
generates a double value in the range [0,1). Java Math
库函数Math.random()
生成范围为[0,1)的双精度值。 Notice this range does not include the 1. 请注意,此范围不包括1。
In order to get a specific range of values first you need to multiply by the magnitude of the range of values you want covered. 为了获得特定的值范围,您首先需要乘以要覆盖的值范围的大小。
Math.random() * ( Max - Min )
This returns a value in the range [0,Max-Min)
. 这将返回[0,Max-Min)
范围内的值。 If you want [5,10]
you need cover 5 integer values so you use: 如果要[5,10]
,则需要覆盖5个整数值,因此您可以使用:
Math.random() * 5
This would return a value in the range [0,5)
这将返回[0,5)
范围内的值
Now you need to shift this range up to the range that you are targeting. 现在,您需要将此范围上移到您要定位的范围。 You do this by adding the Min value. 您可以通过添加最小值来实现。
Min + (Math.random() * (Max - Min))
You now will get a value in the range [Min,Max)
. 现在,您将获得[Min,Max)
范围内的值。 Following our example, that means [5,10)
: 按照我们的示例,这意味着[5,10)
:
5 + (Math.random() * (10 - 5))
But, this is still doesn't include Max and you are getting a double value. 但是,这仍然不包括Max,您将获得双倍的价值。 In order to get the Max value included, you need to add 1 to your range parameter (Max - Min)
and then truncate the decimal part by casting to an int. 为了获得包括的最大值,您需要在范围参数(Max - Min)
上加1,然后通过强制转换为整数来截断小数部分。 This is accomplished via: 这可以通过以下方式完成:
Min + (int)(Math.random() * ((Max - Min) + 1))
And there you have it. 那里有它。 A random integer value in the range [Min,Max]
, or per the example [5,10]
范围为[Min,Max]
或根据示例为[5,10]
随机整数值
5 + (int)(Math.random() * ((10 - 5) + 1))
Good luck! 祝好运!
Yes you cannot access the BodyMassIndex.getBodyMassIndex();
是的,您无法访问BodyMassIndex.getBodyMassIndex();
and BodyMassIndex.getStatus();
和BodyMassIndex.getStatus();
from your class called ClassLab3B since these two methods are not static.. 从您的名为ClassLab3B的类中获取,因为这两个方法不是静态的。
If u make them static, u wont be able to access the non static members of ur class BodyMassIndex.. 如果将它们设为静态,则将无法访问类BodyMassIndex的非静态成员。
So u can return the BodyMassIndex[] from the createObjectsToFillArray() and then access each instance in a for loop and call the printArray()
因此,您可以从createObjectsToFillArray()返回BodyMassIndex [],然后在for循环中访问每个实例并调用printArray()
something like this 像这样的东西
BodyMassIndex[] x= createObjectsToFillArray(a, name, age, weight, height, numberOfPeople);
//creates "x" objects to fill the array
for(int i=0;i<x.length;i++)
{
double BMI = x[i].getBodyMassIndex();
//gets BMI from getBodyMassIndex method in BodyMassIndex.java
String status = x[i].getStatus();
//gets status from getStatus method in BodyMassIndex.java
//double BMI = BodyMassIndex.bmix.getBodyMassIndex();
//String status = BodyMassIndex.bmix.getStatus();
printArray(a, name, age, weight, height, BMI, status);
}
and 和
public static BodyMassIndex[] createObjectsToFillArray(BodyMassIndex[] data, String name, int age, double weight, double height, int numberOfPeople) {
for (int i = 0; i < numberOfPeople; i++) {
data[i] = new BodyMassIndex(name, age, weight, height);
}
return data;
//creates new BodyMassIndex objects with generated variables from methods within
}
you need an Instance of your BodyMassIndex: 您需要您的BodyMassIndex的实例:
BodyMassIndex bmi = new BodyMassIndex(...)
double BMI = bmi.getBodyMassIndex();
The way you use it, means that the methods are declared as static ones in the BMI class. 使用它的方式意味着在BMI类中将这些方法声明为静态方法。 like: 喜欢:
public static double getBodyMassIndex() {...}
but that would not be a great design. 但这不是一个好的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.