簡體   English   中英

ArrayList不打印重復項(Java)

[英]ArrayList not printing duplicates (Java)

我不認為我會遇到那么多麻煩,因為我已經使用帶有規則數組的蠻力方法做到了這一點。 我正在嘗試使用Collections.frequency將來自用戶的重復條目歸為一組,並顯示每個條目出現的次數(如果不止一次); 但是,輸出僅在輸入時打印。 我有兩個課程,我將在下面顯示:

    public class Flower {

private String name;
private String color;
private String smell;
private String hasThorns;

public Flower(String name, String color, String smell, String hasThorns) {
    this.name = name;
    this.color = color;
    this.smell = smell;
    this.hasThorns = hasThorns;
}
public void setName(String name) {
    this.name = name;
}
public void setColor(String color) {
    this.color = color;
}
public void setSmell(String smell) {
    this.smell = smell;
}
public void setThorns(String hasThorns) {
    this.hasThorns = hasThorns;
}
public String getName() {
    return name;
}
public String getColor() {
    return color;
}
public String getSmell() {
    return smell;
}
public String getThorns() {
    return hasThorns;
}
public String toString() {
    return "Name: " + this.name + ", Color: " + this.color + ", Scent? " + this.smell + ", Thorns? " + this.hasThorns;
}
}//end Flower class



    import java.util.*;

public class Assignment3 {
String name = new String();
String color = new String();
String smell = new String();
String hasThorns = new String();

//ArrayList<Flower> flowerPack = new ArrayList<Flower>();
boolean found = false;
public static void main(String[] args) {
    new Assignment3();
}

// This will act as our program switchboard
public Assignment3() {
    Scanner input = new Scanner(System.in);
    ArrayList<Flower> flowerPack = new ArrayList<Flower>();

    System.out.println("Welcome to my flower pack interface.");
    System.out.println("Please select a number from the options below");
    System.out.println("");

    while (true) {
        // Give the user a list of their options
        System.out.println("1: Add an item to the pack.");
        System.out.println("2: Remove an item from the pack.");
        System.out.println("3: Search for a flower.");
        System.out.println("4: Display the flowers in the pack.");
        System.out.println("5: Filter flower pack by incomplete name");
        System.out.println("0: Exit the flower pack interface.");

        // Get the user input
        int userChoice = input.nextInt();

        switch (userChoice) {
            case 1:
                addFlower(flowerPack);
                break;
            case 2:
                removeFlower(flowerPack);
                break;
            case 3:
                searchFlowers(flowerPack);
                break;
            case 4:
                displayFlowers(flowerPack);
                break;
            case 5:
                filterFlowers(flowerPack);
                break;
            case 0:
                exitInterface();
                break;
            default:
                System.out.println("Invalid entry. \nPlease choose between 1-5, or 0: ");
                break;
        }
    }
}
private void addFlower(ArrayList<Flower> flowerPack) {
    // TODO: Add a flower that is specified by the user
    Flower newFlower = new Flower(name, color, smell, hasThorns);

    Scanner input = new Scanner(System.in);

    if(flowerPack.size() < 25)
    {
        System.out.println("Enter the name of the flower you wish to add: ");
        newFlower.setName(input.nextLine());
        System.out.println("Enter the color of the flower: ");
        newFlower.setColor(input.nextLine());
        System.out.println("Does the flower have a scent? Yes or No: ");
        newFlower.setSmell(input.nextLine());
        System.out.println("Does the flower have thorns? Yes or No: ");
        newFlower.setThorns(input.nextLine());

        flowerPack.add(newFlower);
    }
    else
    {
        System.out.println("You may only hold 25 flowers in your flower pack. Please remove at least one before adding another.");
    }
}
private void removeFlower(ArrayList<Flower> flowerPack) {
    // TODO: Remove a flower that is specified by the user
    Scanner input = new Scanner(System.in);

    System.out.println("Enter the name of the flower you want to remove: ");
    String deleteName = input.nextLine();
    System.out.println("Enter the color of the flower you want to remove: ");
    String deleteColor = input.nextLine();
    System.out.println("Is this a flower with a scent? Yes or No: ");
    String deleteSmell = input.nextLine();
    System.out.println("Is this a flower with thorns? Yes or No: ");
    String deleteThorns = input.nextLine();

    for(int i = 0; i < flowerPack.size(); i++) {
        if(flowerPack.get(i).getName().equals(deleteName) && flowerPack.get(i).getColor().equals(deleteColor) && flowerPack.get(i).getSmell().equals(deleteSmell) && flowerPack.get(i).getThorns().equals(deleteThorns))
        {
            flowerPack.remove(i);
            found = true;
            break;
        }
        if(found)
        {
            System.out.println("That flower was successfully removed from your inventory.");
        }
        else
        {
            System.out.println("That flower was not found in your inventory.");
        }
    }
}
private void searchFlowers(ArrayList<Flower> flowerPack) {
    // TODO: Search for a user specified flower

}

這就是我遇到的問題。 我尚未啟動其他方法(搜索,過濾器),因為我希望它在繼續之前能正確顯示。

private void displayFlowers(ArrayList<Flower> flowerPack) {
    // TODO: Display flowers using any technique you like

    for(Flower flower : flowerPack) {
        int duplicates = Collections.frequency(flowerPack, flower);
        System.out.println(flower + " - " + duplicates);
    }
}

private void filterFlowers (ArrayList<Flower> flowerPack) {
    // TODO Filter flower results

}
private void exitInterface() {
    Scanner input = new Scanner(System.in);
    System.out.println("Are you sure you want to exit the flower pack interface? Y or N: ");
    while(true) {
        String answer = input.next();
        if(!"Y".equalsIgnoreCase(answer) && !"N".equalsIgnoreCase(answer))
        {
            System.out.println("Please enter Y or N (not case-sensitive): ");
        }
        if("Y".equalsIgnoreCase(answer))
        {
            System.out.println("Thank you for using the flower pack interface. See ya later!");
            System.exit(0);
        }
        if("N".equalsIgnoreCase(answer))
        {
            break;
        }
    }
}
}

我已經看到了有關Maps / HashSets的示例,但是我現在還不熟悉這些概念,因此無法使用它們。

這是輸出,不正確。 有人可以提示我哪里出問題了嗎?

    Name: rose, Color: red, Scent? yes, Thorns? yes - 1
    Name: rose, Color: red, Scent? yes, Thorns? yes - 1
    Name: rose, Color: pink, Scent? yes, Thorns? no - 1
    Name: daffodil, Color: yellow, Scent? yes, Thorns? no - 1

如您所見,前兩個條目應讀為1,但帶有-2:

喜歡:

    Name: rose, Color: red, Scent? yes, Thorns? yes - 2

您的flower類需要一個equals和hashcode方法,否則java不能判斷兩個flower對象是否相同。

Collections.frequency使用Flower.equals來確定兩個花朵是否相同。 由於您尚未覆蓋equals的默認實現,因此Flower所有實例似乎都是唯一的。

您可以使用IDE生成應該運行良好的equals (和hashCode )實現,然后頻率計數將變得正確,因為這樣將檢測到邏輯上相等的花朵。

例如,由IntelliJ生成,將其添加到Flower

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }

    Flower flower = (Flower) o;

    if (color != null ? !color.equals(flower.color) : flower.color != null) {
        return false;
    }
    if (hasThorns != null ? !hasThorns.equals(flower.hasThorns) : flower.hasThorns != null) {
        return false;
    }
    if (name != null ? !name.equals(flower.name) : flower.name != null) {
        return false;
    }
    if (smell != null ? !smell.equals(flower.smell) : flower.smell != null) {
        return false;
    }

    return true;
}

@Override
public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + (color != null ? color.hashCode() : 0);
    result = 31 * result + (smell != null ? smell.hashCode() : 0);
    result = 31 * result + (hasThorns != null ? hasThorns.hashCode() : 0);
    return result;
}

暫無
暫無

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

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