Java查看arraylist是否包含字符串

Fav*_*las 0 java arraylist

我有一个叫做Paragens这样的课:

public class Paragens {
    static int contadorParagens = 1;

    String nomeParagem;
    int id;

    public Paragens(String nomeParagem) {
        this.nomeParagem = nomeParagem;
        this.id = contadorParagens++;
    }

    // getters and setters for nomeParagem
}
Run Code Online (Sandbox Code Playgroud)

每个Paragens对象都有一个名称和一个Id.

这个类有一个main方法,我创建几个Paragens对象并将它们存储在ArrayList中,如下所示:

public static void main(String[] args) {
    ArrayList<Paragens> paragens = new ArrayList<Paragens>();
    paragens.add(new Paragens("name1");
    // ... add more paragens
}
Run Code Online (Sandbox Code Playgroud)

这工作正常.如果我插入一堆paragens并打印它们,我可以看到tat一切都好.

我想要做的是要求用户输入一个paragem名称然后我想看看该paragem是否已经在ArrayList中.

String name;
System.out.println("Insert paragem name: ");
pickName = sc.nextLine();
System.out.println(paragens.contains(pickName));
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

T.J*_*der 10

contains检查列表是否包含您提交的实际内容.在这种情况下,您传入一个String名称,但将其与Paragem实例进行比较.contains不能神奇地猜测它应该查看Paragem实例上的给定属性来比较字符串.

您可以轻松循环列表以找到自己:

boolean found = false;
for (Paragem p : paragems) {
    if (p.nomeParagem.equals(pickName)) { // Or use an accessor function for `nomeParagem` if appropriate
        found = true;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

......或作为一种功能:

boolean containsParagemWithName(ArrayList<Paragem> paragems, String pickName) {
    for (Paragem p : paragems) {
        if (p.nomeParagem.equals(pickName)) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 或覆盖`equals` (3认同)
  • @Anonymouse:不要覆盖equals以使Paragem等于String.那将是非常非常规的(例如,平等将不再是对称的).等于,hashCode和这些方法非常通用,期望遵循某些契约,并且不应该做出意想不到的事情以适应某些特殊目的. (3认同)