返回集

时间:2016-03-30 17:47:19

标签: java for-loop set hashset

希望另一个简单的问题不应该是困难的,但我是Java的新手并且在苦苦挣扎。我在类setElements中有一组classA,它是一组花药类'对象(classB),它总是只包含两个元素。我需要做的是准备一个接受参数的方法,然后检查setElements的任何一个元素是否等于该参数。如果一个元素相等,则该方法返回该集合中的 other 元素。

我真的很难将功能拿出来,而且我很确定这是因为我平庸的Java技能:)

这是我现在的代码:

Set<classB> setElements = new HashSet<classB>();
 public classA(classB x, class B y) {
        setElements.add(x);
        setElements.add(y);


\\method to return the other element if one element is equal to argument

public classB otherElement(classB argument){
    for (classB x:setElements){
        if (x==argument){
            return \\other element in setElements} } }

请帮忙!

4 个答案:

答案 0 :(得分:0)

如果您的Set总是包含两个元素,您可以将其转换为数组,然后使用索引循环:

public classB otherElement(classB argument) {

    classB[] arrayElements = new classB[2];
    setElements.toArray(arrayElements);

    for (int i=0; i<arrayElements.length; i++) {
        if (arrayElements[i] == argument) {
            return setElements[1-i];
        }
    }
}

答案 1 :(得分:0)

我不知道为什么这种方法被建模为Set。如果元素必须是唯一的,那么使用List会更容易。尽管如此,假设Set中有两个元素,那么可以迭代Set,跟踪找到的内容。类似的东西:

public classB getOtherFromSet(classB arg)
{
   // setElements is the set of elements, with two entries
   classB otherVal = null;
   for (classB x : setElements) {
     if (! (x.equals(arg)) {
       otherVal = x;
     }
   }

   return otherVal;
}

注意如果Set只包含一个等于参数的值,它可以返回null。

顺便说一句,如果遵循关于类名的Java约定,那将是最好的。

答案 2 :(得分:0)

首先,您不能直接从您的班级中添加HashSet元素。您必须按照以下方法进行操作:

public void init() {
    setElements.add(x);
    setElements.add(y);
}

根据您的要求,我建议您使用ArrayList代替HashSet

以下是代码段:

public classA(classB x, classB y) {

    private List<classB> setElements = Arrays.asList(x, y);

    public classB otherElement(classB argument) {
        if(0 == setElements.indexOf(argument)) {
            return setElements.get(1);
        }
        return setElements.get(0);
    }
}

答案 3 :(得分:0)

通用Set中的元素没有任何已定义的顺序,因此从技术上讲,没有“第一”或“第二”元素。但在你的情况下,任务很明确。

如果您确定该集合总是包含两个元素,那么您可以在没有循环和转换的情况下完成所有工作:

public classB otherElement(classB argument){
    Iterator<classB> iterator = setElements.iterator();
    classB first = iterator.next(); 
    classB second = iterator.next(); 
    if (first.equals(argument))
        return second;
    if (second.equals(argument))
        return first;
    return null;
}

如果您也确定argument将始终等于“first”或“second”元素,那么您可以更简单地表达这一点:

public classB otherElement(classB argument){
    Iterator<classB> iterator = setElements.iterator();
    classB first = iterator.next(); 
    return first.equals(argument) ? iterator.next() : first;
}

实际上,Set的使用在这种情况下非常值得怀疑。 我建议创建一个带有三个参数的方法。请将此方法的可读性与前两个方法进行比较:

public classB otherElement(classB argument, classB first, classB second){
    return first.equals(argument) ? second : first;
}

请注意,在大多数情况下,应通过.equals() rather than ==比较对象。