【问题标题】:Java: How do I prevent duplicates from being added to ArrayList using conditional statement?Java:如何防止使用条件语句将重复项添加到 ArrayList?
【发布时间】:2019-09-01 12:42:49
【问题描述】:

我几乎完成了一个收集用户输入(关键字)并显示它们的程序。我让它在这方面发挥作用,但我还需要使用条件 if 语句防止重复的关键字被添加到列表中。我知道我走在正确的轨道上,但是我无法将注意力集中在语法和使用布尔值将输入的关键字与现有的 ArrayList 进行比较。

我知道有诸如 Hash/Set 之类的方法,但我希望在转向其他技术之前能够使用条件语句来完成它。我在搜索中找到的每个答案似乎都解释了 Hash 的使用。

谢谢!

更新:我已根据@Jacob 的回答将我的代码编辑为我目前拥有的内容,这就是我正在寻找的内容,因此感谢您的回复。但它仍然没有删除重复项,就像它没有检查数组并直接跳到alreadyExists == false 条件语句一样。还是我没有正确比较这些值?

import java.util.*;

public class KeywordData {
    private ArrayList<Keyword> keywords = new ArrayList<Keyword>();

    public void create() {
        InputHelper inputHelper = new InputHelper();
        String prompt = "";
        boolean isTrue = true;

        while (isTrue) {
            prompt = inputHelper.getUserInput("Enter a string, otherwise type 'n' to exit:");
            if (!prompt.equals("n")) {
                Keyword keyword = new Keyword();
                keyword.setUserKeyword(prompt);

                boolean alreadyExists = false;
                for (Keyword keyword1 : keywords) {
                    if (keyword1.equals(keyword)) {
                        alreadyExists = true;
                    }
                }

                if (alreadyExists == false) {
                    keywords.add(keyword);
                } else {
                    System.out.println("You already added that word");
                }

            } else {
                break;
            }
        }
    }

    public void displayKeywords() {
        System.out.println();
        System.out.println("********** Your unique user keywords **********");
        for (Keyword keyword : keywords) {
            keyword.display();
        }
        System.out.println();
    }

}

【问题讨论】:

  • 为什么不使用contains 方法?
  • if (!keywords.contains(keyword)) keywords.add(keyword);
  • 感谢@shmosel 的回复。编译并运行,但在我运行程序后它什么也不显示。只是标题:“**********您的唯一用户关键字**********”
  • 可能是您的 display() 方法中的一个错误。如果你想让contains() 工作,你还需要实现equals()hashCode()
  • 你必须为哈希集合实现equals(). You only need hashCode()`。 @shmosel

标签: java for-loop if-statement arraylist boolean


【解决方案1】:

我就是这样做的,我展示了我的整个程序,因为我将您的一些自定义类更改为只是字符串,并且并不真正知道这些自定义类做了什么。

import java.util.*;
import java.io.Console;

public class KeywordData {
    private ArrayList<String> keywords = new ArrayList<String>();
    Scanner reader = new Scanner(System.in);

    public void create() {
        String prompt = "";
        boolean isTrue = true;

        while (isTrue) {
            System.out.println("Enter a string, otherwise type 'n' to exit:");
            prompt = reader.next();
            if (!prompt.equals("n")) {

                boolean alreadyExists = false;
                for (String keyword1 : keywords) {
                    if (keyword1.equals(prompt)) {
                        alreadyExists = true;
                    }
                }
                if (alreadyExists == false) {
                    keywords.add(prompt);
                }else {
                    System.out.println("You already added that word");
                }

            } else {
                break;
            }
        }
    }

    public void displayKeywords() {
        System.out.println();
        System.out.println("********** Your unique user keywords **********");
        for (String keyword : keywords) {
            System.out.println(keyword);
        }
    }

    public static void main(String[] args) {
        KeywordData kd = new KeywordData();
        kd.create();
        kd.displayKeywords();
    }

}

但更简单的检查方法是这样的

if (!prompt.equals("n")) {
    if (keywords.contains(prompt)) {
        System.out.println("You already added that word");
    }else {
        keywords.add(prompt);
    }               
} else {
    break;
}

【讨论】:

  • 谢谢,这绝对是我正在寻找的想法!我已经用你的代码更新了我的帖子(但仍然符合我的类),它正在将项目添加到数组并显示它们,但不能防止重复。我怀疑第一个数组列表循环有问题...
  • @jpsweeney94 我会让你在问题中的代码保持不变。如果您需要进行更新,请将其发布在您的原始问题下方。当我运行我制作的程序时,它会阻止我并告诉我是否输入了重复项。你是说你仍然得到重复?也许您的其他函数之一是否附加到数组中?像keyword.setUserKeyword(prompt); 什么的
  • 好的,从现在开始,我会记住这一点,谢谢@Jacob ...而且你,我仍然得到重复,即使我设置了布尔值,它也不会告诉我我已经输入了那个词。我不确定,但Keyword 类包含userKeyword 字符串变量,keyword.setUserKeyword(prompt); 是 var 的设置器。这就是为 ArrayList 设置对象的原因。我想弄清楚如何在单独的类中使用 Obj 引用和数组来做到这一点,而不是仅仅在同一个类中做一个字符串数组......但我已经到了可以这样做的地步......
  • @jpsweeney94 在您的修改版本中,keyword 的类型为 Keywordkeyword1 的类型为 string,所以不,它们不相等,你不能把你放在@ 987654331@上课。您可能想尝试类似keyword.namekeyword.toString()
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多