#java
#java
Вопрос:
Мой мозг в некотором роде болит, и я не могу понять, почему это не сработает.
У меня есть два arraylist
private ArrayList<String> name = new ArrayList<String>();
private ArrayList<String> name2 = new ArrayList<String>();
Мне нужно проверить, содержит ли значение в ‘name’ значение в ‘name2’, и если это так, выполните итерацию, вот мой текущий код для этого:
private ArrayList<Integer> getForeignKey() {
ArrayList<Integer> foreignKey = new ArrayList<Integer>();
for (int i = 0; i < name.size(); i ) {
int intForeignKey = 1;
for (int x = 0; x < name2.size(); x )
//System.out.println(name.get(i) " ---------------- " name2.get(x));
if (!name.get(i).contains(name2.get(x)))
intForeignKey ;
else
break;
foreignKey.add(intForeignKey);
}
return foreignKey;
}
Когда это распечатано, оно будет нормально работать для пары значений, затем начнет пропускать числа, поэтому на выходе будет:
0
1
2
3
4
5
5
10
когда предполагается, что это
0 1 3 4 5 5 6 7 8 8 8 9 10
Что я делаю не так? Если потребуется больше разъяснений, я сделаю все, что в моих силах.
Редактировать:
Пожалуйста, обратите внимание, что приведенные выше цифры — это всего лишь пример того, как должен выглядеть результат.
имя содержит:
a,b,c,d,e,f,g
name2 содержит
a,b,c,c,d,e,e,f,g,g
имя (индекс i) проверяет, содержит ли оно значение name2 (индекс x), если оно содержит значение, не увеличивайте целое число внешнего ключа, если оно не содержит значения, тогда увеличьте целое число внешнего ключа.
Комментарии:
1. Да? Что именно вам нужно проверить? У вас есть два списка, как вам нужно их сравнить? В вашем примере, каковы входные данные? Вы показываете только выходные данные и ожидаемый результат.
2. Итак, если строка из списка ‘name’ существует в списке ‘name2’, ничего не делайте. Если строка из списка ‘name’ не существует в списке ‘name2’, сохраните ее индекс в списке ‘ForeignKey’. Правильно ли я понял вашу логику?
Ответ №1:
Вы пытаетесь найти имена, которые одинаковы в обеих коллекциях?
private final Set<String> names = new LinkedHashSet<String>();
private final Set<String> names2 = new LinkedHashSet<String>();
public Set<String> namesInBoth() {
Set<String> ret = new LinkedHashSet<String>(names);
ret.retainAll(names2);
return ret;
}
Ответ №2:
Я не уверен, почему это не работает (что в name
и name2
?). Однако гораздо лучший способ сделать это — использовать HashSet для хранения уникальных имен, а затем извлечь их в ArrayList.
Ответ №3:
Возможная ошибка — вы используете .contains для сравнения строк. Вместо этого вам следует использовать .equals или .equalsIgnoreCase.
Редактировать:
private ArrayList<Integer> getForeignKey() {
ArrayList<Integer> foreignKey = new ArrayList<Integer>();
for (int i = 0; i < name.size(); i ) {
boolean found = false;
for (int x = 0; x < name2.size(); x ){
if (name.get(i).equals(name2.get(x))){
found = true;
break;
}
}
if(!found){
foreignKey.add(i);
}
}
return foreignKey;
}
Комментарии:
1. Я спорю с использованием equalsignorecase вместо contains, есть определенные причины, но это было принято во внимание.
2. Из описания: «Мне нужно проверить, совпадает ли значение в ‘name’ со значением в ‘name2’ …» Содержит и равно выполняет разные действия. Например: «123456».contains(«123») вернет true , в то время как .equals вернет false
3. Я изменю это, извините за путаницу
4. Только что отредактировал ваш код. Возможно, я пропустил } или что-то еще, но вы должны уловить идею.