2011-11-27 91 views
0

我有一个名为Paragens这样的类:的Java看看ArrayList包含字符串

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 
} 

每个Paragens对象都有一个名称和ID。

这个类,我创建几个Paragens对象,并将它们存储这样一个ArrayList内的主要方法:

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

这是工作确定。如果我插入一串白细胞并打印它们,我可以看到达到一切都好。

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

String name; 
System.out.println("Insert paragem name: "); 
pickName = sc.nextLine(); 
System.out.println(paragens.contains(pickName)); 

我在做什么错?

回答

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; 
    } 
} 

...或者作为一个函数:

boolean containsParagemWithName(ArrayList<Paragem> paragems, String pickName) { 
    for (Paragem p : paragems) { 
     if (p.nomeParagem.equals(pickName)) { 
      return true; 
     } 
    } 
    return false; 
} 
+3

或覆盖'equals' –

+0

如果你将它变成了它自己的方法,你可以不用'found'标志,只需在循环中返回true或者在返回后返回false。 – Thilo

+3

@Anonymouse:不要重写equals来使Paragem等于一个String。那将是*非常规的(例如,平等将不再是对称的)。 Equals,hashCode和这些方法是非常通用的,期望遵循某些合同,并且不应该做出意想不到的事情来适应某些特殊的目的。 – Thilo

1

那么,你需要自己实现contains方法。对整个数组执行for循环,并检查其中一个元素的名称是否与您要添加的元素的名称相同。如果不是,请添加一个new Paragens(pickName)

+0

'contains'方法没有问题。他只需要实现'equals'或者手动检查循环中的实例。 –

1

默认情况下,对象将通过它们的内存位置进行比较。所以如果你有两个同名的Paragem,它们仍然不相等。

因此,要么,你检查每个人的名字:

boolean checkDuplicate(String pickName) { 
    for (Paragem p : paragems) { 
     if (p.nomeParagem.equals(pickName)) return true; 
    } 
    return false; 
} 

或实施(重写)equals方法来比较名称(应新Paragem对象上调用contains然后代替String,虽然)。

+0

*“默认情况下,对象会根据其内存位置进行比较,所以如果您有两个同名的Paragem,它们仍然不相等。”*是,但不是*比较两个Paragem实例。他将'String'与'Paragem'进行比较。 –

+0

@ T.J。克劳德:正确。这就是为什么它更少工作。 ;-)不幸的是,Java Collections中的'contains'是为'Object'定义的,它引入了这种类型的错误。 –

+0

理解了for循环,但最后一件事(实现(重写)equals方法来比较名称。)不明白,因为我是Java新手。不过将实现for循环 – Favolas

相关问题