Как мне написать общий цикл foreach на Java?

#java #foreach

#java #foreach

Вопрос:

На данный момент у меня есть следующий код:

 /*
 * This method adds only the items that don’t already exist in the
 * ArrayCollection. If items were added return true, otherwise return false.
 */
public boolean addAll(Collection<? extends E> toBeAdded) {

    // Create a flag to see if any items were added
    boolean stuffAdded = false;


    // Use a for-each loop to go through all of the items in toBeAdded
    for (something : c) {

        // If c is already in the ArrayCollection, continue
        if (this.contains(c)) { continue; }     

            // If c isn’t already in the ArrayCollection, add it
            this.add(c)
            stuffAdded = true;
        }

        return stuffAdded;
    }
}
  

Мой вопрос таков: чем мне заменить что-либо (и c), чтобы заставить это работать?

Комментарии:

1. this.contains()? реализует ли ваш объект Collection?

2. @Cosmin, вероятно, поскольку он реализует addAll здесь 🙂

Ответ №1:

Что-то вроде этого должно делать:

 // Use a for-each loop to go through all of the items in toBeAdded
for (E c : toBeAdded) {

    // If c is already in the ArrayCollection, continue
    if (this.contains(c)) {
        continue;
    }

    // If c isn’t already in the ArrayCollection, add it
    this.add(c);

    stuffAdded = true;
}
  

Общая форма такова:

 for (TypeOfElements iteratorVariable : collectionToBeIteratedOver) `
  

Комментарии:

1. Вам не нужно this перед вызовами методов.

Ответ №2:

Написать foreach на Java довольно просто.

 for(ObjectType name : iteratable/array){ name.doSomething() }
  

Вы можете выполнить foreach либо с помощью итерации, либо с массивом. Имейте в виду, что если вы не проверяете тип вашего итератора (Iterator), то вам нужно использовать Object для ObjectType. В противном случае используйте любое значение E. Например

 ArrayList<MyObject> al = getObjects();
for(MyObject obj : al){
  System.out.println(obj.toString());
}
  

Для вашего случая:

    for(E c : toBeAdded){
        // If c is already in the ArrayCollection, continue
        if( this.contains(c) ){ continue;}     

        // If c isn’t already in the ArrayCollection, add it
        this.add(c)
        stuffAdded = true;
    }
  

Комментарии:

1. * не тор повторения, а итера ble .

Ответ №3:

E — это коллекция, c — переменная внутри цикла for (E c : добавлено дополнительно) …

Комментарии:

1. E не является коллекцией. E — это тип переменной в цикле.

Ответ №4:

 public boolean addAll(Collection<? extends E> toBeAdded) {
    boolean stuffAdded = false;
    for(E c : toBeAdded){
        if(!this.contains(c)){
             this.add(c)
             stuffAdded = true;
        }
    }
    return stuffAdded;
}
  

Также взгляните на Collections.addAll

Комментарии:

1. Это addAll метод, который он реализует! 😀

2. Извините. Я просто думаю, что лучше использовать некоторый набор в качестве внутреннего хранилища.

3. Вы уверены? Даже если вы работали в Sun и вам было поручено реализовать ArrayList ?

4. Нет, конечно 🙂 Я могу предположить, что для этого случая может быть реализована коллекция.

Ответ №5:

Вы можете написать цикл foreach двумя способами, и они эквивалентны.

 List<Integer> ints = Arrays.asList(1,2,3);
int s = 0;
for (int n : ints) { s  = n; }
  

 for (Iterator<Integer> it = ints. iterator(); it.hasNext(); ) {
    int n = it.next();
    s  = n;
}