Вернуть первый или второй элемент в наборе
Надеюсь, еще один простой вопрос, который не должен быть сложным, но я новичок в Java и борюсь. У меня есть набор setElements
в классе classA
, который представляет собой набор объектов класса пыльника (classB
), который всегда будет содержать только два элемента. Что мне нужно сделать, это подготовить метод, который принимает аргумент, а затем проверяет, если какой-либо элемент setElements
равен этому аргументу. Если один элемент равен, метод возвращает другой элемент из набора.
Я просто изо всех сил пытаюсь получить функциональность, и я вполне уверен, что это из-за моих посредственных навыков 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 ответа
Я не знаю, почему этот подход моделируется как 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 содержит только значение, равное аргументу.
Кроме того, было бы лучше, если бы были соблюдены соглашения Java об именах классов.
Если ваш 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];
}
}
}
Прежде всего, вы не можете поместить элементы в свой 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);
}
}
Элементы в общем 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
всегда будет равен либо "первому", либо "второму" элементу, тогда вы можете выразить это еще проще:
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()
скорее, чем==
,