簡體   English   中英

使用Collections或我的函數計算ArrayList中對象的出現

[英]Counting the occurrence of objects in an ArrayList, using either Collections or my functions

我有一個FlowerClass對象的ArrayList。 每個FlowerClass對象都有一個名稱。 我想遍歷ArrayList並對其進行計數。 我想顯示每個的數量。 因此,如果我有三個名為Rose的FlowerClass對象,兩個名為Daffodil的對象和一個名為Tulip的對象,我想顯示以下內容:

  • 找到3朵玫瑰
  • 找到3個水仙花
  • 找到3郁金香

到目前為止,我已經使用我制作的兩個函數對它進行了正確計數。 問題是我遍歷了整個ArrayList ...因此它將多次顯示結果。 例如,如果用戶添加了3朵玫瑰和2個黃水仙...輸出如下所示:

  • 找到3朵玫瑰
  • 找到3朵玫瑰
  • 找到3朵玫瑰
  • 找到2個水仙花
  • 找到2個水仙花

我知道為什么代碼會這樣做,但是我不知道如何清除輸出的重復。 我也不知道如何正確實現Collections。 在...之前,我已經在字符串的ArrayList上使用過Collections,並且它可以正常工作。 但是這一次,我將在對象的ArrayList上使用Collections,我想檢查每個特定名稱的出現頻率。 這是主要的類:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class MainClass {

    static ArrayList<FlowerClass> flowerPack = new ArrayList<FlowerClass>();


    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        while(true){
            System.out.println("1. Add flower to flowerpack.");
            System.out.println("2. Remove flower from the flowerpack.");
            System.out.println("3. Search for a flower in the flowerpack."); 
            System.out.println("4. Display the flowers in the flowerpack.");
            System.out.println("5. Exit the program.");

            int userChoice = input.nextInt();

            switch(userChoice){
            case 1:
                addFlower();
                break;
            case 2:
                searchFlower();
                break;
            case 3:
                displayFlowers();
                break;
            case 4:
                    System.out.println("Goodbye!");
                System.exit(0);
            }
        }
    }

    public static void addFlower(){
        if (FlowerClass.numberFlowers() == 25){
            System.out.println("There are 25 flowers in the flowerpack. Remove at least one in order to add more.");
            return;
        }
        Scanner input = new Scanner(System.in);
        System.out.println("What is the flower's name?");
        String desiredName = input.nextLine();
        System.out.println("What is the flower's color?");
        String desiredColor = input.nextLine();
        System.out.println("How many thorns does it have?");
        Scanner input2 = new Scanner(System.in);
        int desiredThorns = input2.nextInt();
        System.out.println("What does it smell like?");
        String desiredSmell = input.nextLine();
        flowerPack.add(new FlowerClass(desiredName, desiredColor, desiredThorns, desiredSmell));
    }

    public static void searchFlower(){
        System.out.println("Enter the flower you want to search for.");
        Scanner input = new Scanner(System.in);
        String userChoice = input.nextLine();
        int occurrences  = 0;

        for (FlowerClass flower: flowerPack){
            String name = flower.getName();
            if (userChoice.equals(name)){
                occurrences++;
            }

            else if(occurrences == 0){
                System.out.println("Match not found.");
                return;
            }
        }

        System.out.println("Found " + occurrences + " " + userChoice);
    }

    public static void searchFlower(String desiredFlower){
        int occurrences = 0;

        String userChoice = desiredFlower;
        for (FlowerClass flower: flowerPack){
            String name = flower.getName();
            if (userChoice.equals(name)){
            occurrences++;
            }
        }

        System.out.println("Found " + occurrences + " " + userChoice);
    }

    public static void displayFlowers(){
        int repeats = 0;

        /*for (FlowerClass flower: flowerPack){
            System.out.println(flower.getName());
        }
        System.out.println("Number of flowers in pack: " + FlowerClass.numberFlowers());*/

            //int occurrences = Collections.frequency(flowerPack, name);
            //System.out.println(name + ": " + occurrences);
        for (FlowerClass flower: flowerPack){
            String name = flower.getName();
            searchFlower(name);
        }
    }
}

這是FlowerClass:

public class FlowerClass {

    public static int numberOfFlowers = 0;
    public String flowerName = null;
    public String flowerColor = null;
    public int numberThorns = 0;
    public String flowerSmell = null;

    FlowerClass(){

    }

    FlowerClass(String desiredName, String desiredColor, int desiredThorns, String desiredSmell){
        flowerName = desiredName;
            flowerColor = desiredColor;
        numberThorns = desiredThorns;
        flowerSmell = desiredSmell;
        numberOfFlowers++;
    }

    public void setName(String desiredName){
        flowerName = desiredName;

    }

    public String getName(){
        return flowerName;
    }

    public static int numberFlowers(){
        return numberOfFlowers;
    }
}

如果您查看我在主類中的最后一個函數,您會發現我已注釋掉嘗試實現Collections.frequency的方式。 我還嘗試制作一個字符串的多維數組,並存儲花朵的名稱以及數組中花朵的數量。 這樣可以正確計數所有內容,但是我不確定如何在計數旁邊顯示名稱。 事情變得非常混亂,所以我暫時放棄了這一嘗試,轉而嘗試另外兩個選項。 如果我可以找到一種方法來消除重復的輸出行(或者可以找到一種方法來使Collections正常工作),那么就不需要修改多維數組了。

任何提示將不勝感激。 感謝您的時間。

您可以將您的Flower放在Set 但是我能想到的最簡單的解決方案是對花朵進行排序。 所以首先,實現一個Comparator<FlowerClass>

public static class FlowerComparator implements Comparator<FlowerClass> {
  @Override
  public int compare(FlowerClass o1, FlowerClass o2) {
    return o1.getName().compareTo(o2.getName());
  }
}

然后,您可以使用Collections.sort(List, Comparator)排序

FlowerComparator flowerComparator = new FlowerComparator();
Collections.sort(flowerPack, flowerComparator);

然后您的for循環必須是這樣的(停止搜索同一朵花),

String lastName = null;
for (int i = 0; i < flowerPack.size(); i++){
  FlowerClass flower = flowerPack.get(i);
  String name = flower.getName();
  if (lastName == null || !lastName.equals(name)) {
    lastName = name;
    searchFlower(name); // or return the number found, and then add that count to i.
  }
 }

有趣的代碼,但是它不能像我那樣做。

在當前情況下,您需要跟蹤已經遇到的花朵名稱:

public static void displayFlowers(){
    //int repeats = 0;
    List<String> displayedFlowerTypes = new ArrayList<String>();
    for (FlowerClass flower: flowerPack){
        String name = flower.getName();
        if(!displayedFlowerTypes.contains(name))
        {
            displayedFlowerTypes.add(name);
            searchFlower(name);
        }
    }
}

我寧願做的是維護一個Map,該Map跟蹤花朵類型的數量,並從中獲取類型的數字:

public class MainClass {

static List<FlowerClass> flowerPack = new ArrayList<FlowerClass>();
static Map<String, Integer> flowerCount = new HashMap<String, Integer>();

public static void addFlower() {
    if (FlowerClass.numberFlowers() == 25) {
        System.out.println("There are 25 flowers in the flowerpack. Remove at least one in order to add more.");
        return;
    }
    Scanner input = new Scanner(System.in);
    System.out.println("What is the flower's name?");
    String desiredName = input.nextLine();
    System.out.println("What is the flower's color?");
    String desiredColor = input.nextLine();
    System.out.println("How many thorns does it have?");
    Scanner input2 = new Scanner(System.in);
    int desiredThorns = input2.nextInt();
    System.out.println("What does it smell like?");
    String desiredSmell = input.nextLine();
    flowerPack.add(new FlowerClass(desiredName, desiredColor, desiredThorns, desiredSmell));
    if(!flowerCount.containsKey(desiredName))
    {
        flowerCount.put(desiredName, 1);
    }
    else
    {
        int currentCount = flowerCount.get(desiredName);
        flowerCount.put(desiredName, currentCount+1));
    }
}

這樣,您可以將花朵顯示如下:

    public static void displayFlowers() {
        for (String name : flowerCount.keySet()) {
            //searchFlower(name);
            System.out.println("Found " + flowerCount.get(name) + " " + name);
        }
    }

暫無
暫無

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

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