从不同数据类型的ArrayList获取最高编号

时间:2017-04-26 13:42:06

标签: java arrays arraylist

我正在开发一个程序,提示用户输入姓名,年龄和性别。该程序应该从每个输入中给我一个名称,年龄和性别的列表,并告诉我谁是该列表中最老的人。我创建了一个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);
    }
}

5 个答案:

答案 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());