2017-04-26 61 views
0

我正在處理一個提示用戶輸入姓名,年齡和性別的程序。該程序應該給我一個名稱,年齡和性別從每個輸入的列表,並告訴我誰是誰從這個名單中最古老的人。我創建了一個ArrayList來保存這些值,我確定使用增強的循環打印出名稱,年齡和性別。我遇到的麻煩是讓程序從ArrayList打印出最高(最老)的數字。我創建了一種替代方法來創建一個只有年齡的附加ArrayList,但我似乎沒有找到從原始ArrayList中獲取此方法的方法。這種替代方式只給出了額外數組中最高的數字,但如果我想打印年齡最大的人的姓名,它將不起作用。我會感謝一些幫助弄清楚這一點。我對Java真的很陌生。從不同數據類型的ArrayList獲取最高編號

這裏我到目前爲止的代碼:

從Person類:

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

回答

1

想象一下以下的實際生活的場景:有一組人,其別不瞭解對方的任何事情,而旁觀者則想知道誰最老。你不能問一個人:你是最古老的?因爲他們不知道小組中的其他人有多大年紀。

相反,你必須問每個人他們有多大年齡,並根據這一點確定誰是最古老的。


在你的代碼

因此,private int oldestPerson;場和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 arraypersonAges.add(new Integer(age));

這樣你從獲得青睞人員(使用你的吸氣劑getAge()並將其存儲在maxAge中)。

+1

非常感謝你!這真的爲我澄清! – Monique

+0

@Monique不客氣! :)既然你已經說過你是Java新手,我保持基本,沒有太多新東西。確實,你也可以使用'Comparator'或者Java 8 lambda來解決這個問題,就像其他答案一樣,但是這樣做會讓你的代碼變得太過分了,恕我直言。最重要的是要知道你的代碼出了什麼問題,爲什麼,所以下次你可以自己解決它。 ;) –

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 oldest = persons.stream() 
    .sorted(Comparator.comparing(Person::getAge).reversed()) 
    .findFirst().get(); 

增加了一個標準toString()方法您的Person類打印結果

System.out.println(oldest); 

現在打印:

Person [name=Kees, age=100, gender=M] 

打印perso名單的細節的另一種方法NS採用forEach(),而不是一個for循環

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

因爲我對java還是很新的東西,所以我一直無法使用比較器。但我會讓自己陷入困境。非常感謝。 – Monique

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()); 
0

我已經創建了一個可替代的方式來做到這一點通過創建一個只有年齡的Adoringal ArrayList,但我似乎沒有找到一種方法從原始數組列表中獲取 。

這是非常坦率的一個可怕的想法,你應該儘快忘掉這種方式。

您已經迭代了整個人員列表。你現在所要​​做的就是創建一個變量,保存年齡最高的人(可以稱之爲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內的最高年齡的人,並可以打印和它的屬性。

+0

非常感謝您的幫助! – Monique

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