当前位置: 首页 > 知识库问答 >
问题:

从不同数据类型的ArrayList中获取最大值

晏鸿畅
2023-03-14

我正在开发一个程序,提示用户输入姓名、年龄和性别。该程序应该从每个输入中给我一个姓名、年龄和性别的列表,并告诉我谁是该列表中年龄最大的人。我已经创建了一个数组列表来保存这些值,我可以使用增强循环打印出姓名、年龄和性别。我遇到的问题是让程序打印出数组列表中最高(最老)的数字。我已经创建了一个替代方法,通过创建一个只有年龄的附加数组列表来实现这一点,但是我似乎没有找到从原始数组列表中获取这一点的方法。这种替代方法只给出了额外数组中的最高数字,但是如果我想打印年龄最大的人的名字,这是行不通的。我会感谢一些帮助来解决这个问题。我真的是新来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; 
    }
}

来自Persontest课程:

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);
    }
}

共有3个答案

滑乐逸
2023-03-14

我创建了一个人的测试列表来说明我的解决方案:

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 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循环

persons.forEach(p -> System.out.println(p.getName() + " " + p.getAge() + " " + p.getGender()));

袁泰
2023-03-14

您可以使用比较器按年龄对列表进行排序,并获得最旧的列表,例如:

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());
龙俊美
2023-03-14

想象一下下面的现实场景:有一群人彼此一无所知,而你作为旁观者想知道谁是最年长的。你不能问一个人:你是最大的吗?因为他们不知道团队中其他人的年龄。

取而代之的是,你必须询问每个人的年龄,并在此基础上确定谁是最大的。

所以在你的代码中,应该从Person中删除私有int oldecPerson;字段和公共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

这样,您就可以从这些人那里获得年龄(使用gettergetAge()并将其存储在maxAge中)。

 类似资料:
  • 问题内容: 我有一个ResultSet返回不同类型的数据。该查询是动态构造的,因此在编译时,我不知道查询将返回哪种类型的值。 假设所有结果都是字符串,我编写了以下代码。但是我也想获取每个值的类型。我怎样才能做到这一点? 以下是我编写的代码。 此时,我想获取列类型,并根据数据类型获取值。 问题答案: 所述返回一个指定列类型值发现。 例:

  • 问题内容: 有一个ArrayList存储整数值。我需要在此列表中找到最大值。例如,假设arrayList存储的值为:,最大值为。 寻找最大值的有效方法是什么? @Edit:我只是找到一个不确定的解决方案 这将返回最大值。 比较每个值的另一种方法,例如 问题答案: 你可以使用轻松实现所需的内容- 高效阅读 -足够的 Javadoc for Collections.max 根据其元素的自然顺序返回给定

  • 问题内容: 这是我的数据框df 我正在尝试从数据帧的每一行中获取最大值,我期望这样的输出 这就是我尝试过的 我没有得到正确的输出,任何帮助将不胜感激。谢谢 问题答案: 使用有: 如果需要新列:

  • 我有两个具有FK关系的表。我想要的相当于: 我如何在jOOQ中有效地做到这一点?最后,每个结果行需要一个ARecord实例和一个BRecord实例。

  • 这是正确的工作,但它绘制了许多标记的坐标小于600米的用户的位置。我想要的是只在折线的最近点画一个标记。某种程度上评估来自用户的<600的所有coord,然后选择最接近的。感谢任何帮助。