簡體   English   中英

根據類的值將一個數組分成兩個數組。 爪哇

[英]Seperate one array into two arrays based on the class's values. JAVA

所以我有三個類, PersonGroupOfPeople和一個Main類。

班級人:

public class Person {
    
    private String name;
    private int age;
    private char gender;
    private double weight;

    public char getGender() {
        return gender;
    }
    
    public void setGender(char gender) {
        this.gender = gender;
    }
    
    ... other getters and setters respectively
}

如您所見,Person 類有一個性別實例變量。 GroupOfPeople我創建了一組人員,如下所示:

private Person[] personGroup = new Person[5];

這將存儲所有人,無論其性別如何。 我想要的是一種將男人與數組中的所有其他人分開的方法。

因此,我創建了findMen()方法:

public void findMen() {
        int counter = 0;
        Person[] allMen = new Person[5];
        
        while (counter < personGroup.length) {
            if (personGroup[counter].getGender() == 'M') {
                allMen[counter] = personGroup[counter];
            } else {
                break;
            }
            counter++;
        }
        
        System.out.println("All the men are:");
        for (int i = 0; i < allMen.length; i++) {
            if (allMen[i] != null) {
                System.out.println(allMen[i].getName());
            }
        }
    }

這不起作用,它只向allMen數組添加了 1 個人,而我在主方法中定義了更多人:

GroupOfPeople gop = new GroupOfPeople();
        
        Person p1 = new Person();
        p1.setName("Person 1");
        p1.setAge(40);
        p1.setGender('M');
        
        Person p2 = new Person();
        p2.setName("Person 2");
        p2.setAge(30);
        p2.setGender('F');
        
        Person p3 = new Person();
        p3.setName("Person 3");
        p3.setAge(20);
        p3.setGender('M');

        gop.findMen();

輸出是:

All the men are:
Person 1

雖然預期的輸出是:

All the men are:
Person 1
Person 3

我希望你能給我一些關於我做錯了什么的見解。

您的 break 語句放置不正確。 第一次你沒有得到一個男人時它會中斷。 當您遍歷完整個 personGroup 時,中斷。

沒關系,解決了...

Person[] allMen = new Person[5];

for (int i = 0; i < personGroup.length; i++) {
            if (personGroup[i] != null) {
                if (personGroup[i].getGender() == 'M') {
                    for (int j = 0; j < allMen.length; j++) {
                        if (allMen[j] == null) {
                            allMen[j] = personGroup[i];
                            break;
                        }
                    }
                }
            }
        }

問題就在這里。 擺脫休息;

 while (counter < personGroup.length) {
        if (personGroup[counter].getGender() == 'M') {
              allMen[counter] = personGroup[counter];
        } else {
                break;  // get rid of this, you stop if no M is found. 
        }
            counter++;
  }

像這樣試試

while (counter < personGroup.length) {
        if (personGroup[counter].getGender() == 'M') {
              allMen[counter] = personGroup[counter];
        } 
        counter++;
}

一旦你找到一個女性,休息就會導致它結束循環。 刪除時出現 NullPointerException 的原因是因為使用了數組

ArrayList<Person> allMen = new ArrayList<Person>();
  for(Person p : personGroup){
    if(p.getGender() == 'M') allMen.add(p);
}

最后,迭代和輸出 man 只需做同樣的事情:

for(Person p : allMen){
  System.out.println(p.getName());
}

您的 else 正文包含一個break 這意味着當找到一個人而不是一個人時,循環結束。 您可能想在此處使用continue (或完全刪除else )。

不過我有兩個建議:

列表

使用List而不是數組。 List接口的一個廣泛使用的實現是ArrayList 優點是列表是動態大小的。 這意味着您可以在不知道容量的情況下將無限數量的項目添加到列表中。

// Convert the array to a list, if necessary. However, I suggest you replace all arrays
// with lists
List<Person> allPersons = Arrays.asList(personGroup);

List<Person> men = new ArrayList<>();
for (Person p : allPersons) {
    if (p.getGender() == 'M') {
        men.add(p);
    }
}

Java 8 附帶了 Streams API。 這可以使您的代碼更加簡潔。

List<Person> men = allPersons.stream() // Stream over all persons
    .filter(p -> p.getGender() == 'M') // Select only men
    .collect(Collectors.toList());     // Put them into a List

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM