我正在开发一个程序,提示用户输入姓名,年龄和性别。该程序应该从每个输入中给我一个名称,年龄和性别的列表,并告诉我谁是该列表中最老的人。我创建了一个ArrayList来保存值,我可以使用增强的循环来打印名称,年龄和性别。我遇到的麻烦是让程序打印出ArrayList中最高(最旧)的数字。我创建了另一种方法来创建一个只有年龄的附加ArrayList,但我似乎没有找到从原始ArrayList获取此方法的方法。这种替代方式只给出了额外阵列中最高的数字,但如果我想用他/她的年龄打印最老的人的名字,它就不会起作用。我会很感激帮助解决这个问题。我是Java新手。
到目前为止我的代码:
来自人类:
package person;
public class Person {
private String name ;
private int age;
private String gender;
private int oldestPerson;
public Person(String name1, int age1, String gender1){
name = name1;
age = age1;
gender = gender1;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String getGender() {
return gender;
}
public void changeName(String newName){
name = newName;
}
public void changeAge(int newAge){
age = newAge;
}
public void changeGender(String newGender){
gender = newGender;
}
public int getOldest(int max){
if (age > max){
max = age;
}
return oldestPerson;
}
}
来自personTester类:
package person;
import java.util.Scanner;
import java.util.ArrayList;
public class personTester {
public static void main(String [] args){
ArrayList<Person> personList = new ArrayList<Person>();
ArrayList<Integer> personAges = new ArrayList<Integer>(); //extra array
boolean Done = false;
Scanner input = new Scanner(System.in);
while(!Done){
System.out.println("enter a name");
String name = input.next();
System.out.println("enter an age");
int age = input.nextInt();
System.out.println("enter a gender");
String gender= input.next();
personList.add(new Person(name, age, gender)); //put a person inside an arraylist
personAges.add(new Integer(age));
System.out.println("Press Y to exit or N to continue");
String choice = input.next();
if(choice.equalsIgnoreCase("Y")){
Done=true;
}
}
for(Person e :personList){
System.out.println("Name: "+e.getName() +" - Age: "+ e.getAge()+" -
Gender: " + e.getGender());
} // getting the highest number from the aditional array.
int max = 0;
for (int ages: personAges){
if (ages > max){
max = ages;
}
}
System.out.println("The oldest person in the list is " + max);
}
}
答案 0 :(得分:1)
想象一下以下现实生活场景:有一群人对彼此一无所知,而你作为旁观者想知道谁是最老的。你不能问一个人:你是最老的吗?因为他们不知道小组中其他人的年龄。
相反,你必须问每个人他们的年龄,并根据这个确定自己谁是最老的。
因此,在您的代码中,应从Person中删除public int getOldest(int max)
字段和age
方法。他们不知道他们是否是最老的,他们只能给你他们int max = 0;
for(int ages : personAges){
if(ages > max){
max = ages;
}
}
System.out.println("The oldest person in the list is " + max);
而你(程序员)应该向所有人询问年龄,并根据谁是最老的人来确定。
因此,请更改代码的这一部分:
int maxAge = 0;
for(Person p : personList){
int pAge = p.getAge();
if(pAge > maxAge){
maxAge = pAge;
}
}
System.out.println("The oldest person in the list is " + maxAge + " years old");
对此:
ArrayList<Integer> personAges= new ArrayList<Integer>(); //extra array
您还可以删除personAges.add(new Integer(age));
和getAge()
就像这样,你可以从人物中获取年龄(使用你的getter maxAge
并将其存储在upgrades
)。
答案 1 :(得分:0)
我创建了一个Person
的测试列表来说明我的解决方案:
List<Person> persons = new ArrayList<>();
persons.add(new Person("Kees", 100, "M"));
persons.add(new Person("Kees", 0, "V"));
persons.add(new Person("Kees", 10, "V"));
persons.add(new Person("Kees", 1, "M"));
然后使用Java 8流,您可以使用reversed()
对Person的年龄(从年龄到年轻)进行排序,然后得到第一个结果:
Person oldest = persons.stream()
.sorted(Comparator.comparing(Person::getAge).reversed())
.findFirst().get();
在Person类中添加了标准toString()
方法以打印结果
System.out.println(oldest);
现在打印:
Person [name=Kees, age=100, gender=M]
打印人员列表详细信息的另一种方法是使用forEach()
而不是for-loop
persons.forEach(p -> System.out.println(p.getName() + " " + p.getAge() + " " + p.getGender()));
答案 2 :(得分:0)
一种方法是使用流max
方法并传入您自己的comparator
:
ArrayList <Person> personList= new ArrayList<Person>();
Person oldestPerson = personList.stream().max(Comparator.comparingInt(Person::getAge)).get();
System.out.println("oldest persons name is: " + oldestPerson.getName() + " age is: " + oldestPerson.getAge());
答案 3 :(得分:0)
我创建了另一种方法来创建一个Aditional ArrayList只有年龄,但我似乎没有找到方法得到 这来自原始数组列表。
坦率地说,这是一个可怕的想法,你应该尽快忘记这一点。
您已经遍历了整个人员列表。您现在要做的就是创建一个变量来保存具有最高年龄的Person(让我们称之为highestAgePerson
)。在for循环的每次迭代中,您现在检查当前打印的人的年龄是否高于highestAgePerson
所表示的人的年龄,并将highestAgePerson
设置为该新人。案件。
final Person highestAgePerson = null; // initialize to null
for(Person e :personList){
System.out.println("Name: "+e.getName() +" - Age: "+ e.getAge()+" -
Gender: " + e.getGender());
if(highestAgePerson==null || highestAgePerson.getAge() < e.getAge()) {
highestAgePerson = e;
}
}
之后,您将在变量highestAgePerson
中拥有年龄最高的人,并且可以打印它及其属性。
答案 4 :(得分:0)
您可以使用比较器按年龄对列表进行排序,并获取最旧的列表,例如:
String choice;
do {
System.out.println("enter a name");
String name = input.next();
System.out.println("enter an age");
int age = input.nextInt();
System.out.println("enter a gender");
String gender = input.next();
personList.add(new Person(name, age, gender)); //put a person inside an
System.out.println("Press Y to exit or N to continue");
choice = input.next();
} while (choice.equalsIgnoreCase("Y"));
Collections.sort(personList, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println("The oldest person in the list is " +
personList.get(personList.size()-1).getName() +
" His/Her age is " + personList.get(personList.size()-1).getAge());