Foreach в foreach, удаляя элементы из списка - PullRequest
2 голосов
/ 11 июня 2019

Я создаю Java-приложение на основе того, кто это? Сейчас я делаю метод, в котором я хочу получить другие карточки, когда на вопрос дан ответ.

У меня есть два списка:

Список - это список ImageView, в котором у меня есть 24 изображения, которые должны представлять карты.

Другой список - это список из 24 объектов карты.

Теперь я хочу удалить ImageViews из списка ImageView, если идентификатор представления изображения совпадает с именем карты в ImageView.

Я пытался сделать foreach в foreach, а затем удалить элемент из списка, но не смог разобраться.

Метод, который я создал:

public List<ImageView> getImageViews(List<Card> newCards){

    for (ImageView imageView: new ArrayList<>(allCards)) {
        String imageName = imageView.getId().toLowerCase();

        for (Card card: new ArrayList<>(newCards)){
            String cardName = card.getName().toLowerCase();

            if (!imageName.equals(cardName)){
                allCards.remove(imageView);
            }
        }
    }

    return allCards;
}

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Некоторые указатели:

1) allCards.remove(imageView); будут работать только в том случае, если равно равно () в ImageView, следовательно,

2) Это означает, что вы хотите удалить карту, еслиэлементы соединения не совпадают:

if (!imageName.equals(cardName)){
    allCards.remove(imageView);
}

Вы удалите элемент только тогда, когда он соответствует, пока вы сказали:

Теперь я хочу удалить ImageViews из списка ImageView, еслиИдентификатор представления изображения совпадает с именем карты в ImageView.

Что-то в этом случае было бы лучше:

if (imageName.equals(cardName)){
    allCards.remove(imageView);
    break; // to go back to the outer loop
}

С помощью Iterator вы могли бы создавать вещиболее простой и не полагаясь на переопределение equals ():

public List<ImageView> getImageViews(List<Card> newCards){
    for (Iterator<ImageView> imageViewIt = allCards.iterator(); imageViewIt.hasNext();) {
        ImageView imageView = imageViewIt.next();
        String imageName = imageView.getId().toLowerCase();
        for (Card card: newCards){
            String cardName = card.getName().toLowerCase();
            if (imageName.equals(cardName)){
                imageViewIt.remove();
                break;
            }
        }
    }
    return allCards;
}

А с Java 8 вы можете даже сделать это:

public List<ImageView> getImageViews(List<Card> newCards){
    allCards.removeIf(view -> 
                       newCards.anyMatch(card -> 
                                card.getName().equalsIgnoreCase(view.getId())
                     );
   return allCards;
}

Этот код работает.

0 голосов
/ 11 июня 2019

Просто создайте другой массив.Проще и меньше кода.Моя Java может быть не совсем правильной, это было давно.Но, надеюсь, вы получите идею:

public List<ImageView> getImageViews(List<Card> newCards){
 List<Card> returnObject = new List<Card>();
for (ImageView imageView: new ArrayList<>(allCards)) {
    String imageName = imageView.getId().toLowerCase();

    for (Card card: new ArrayList<>(newCards)){
        String cardName = card.getName().toLowerCase();

          //Instead of a NOT, let's look for an IS
        if (imageName.equals(cardName)){
            returnObject.add(imageView)
        }
    }
}

return allCards;

}

0 голосов
/ 11 июня 2019

Я попытался создать foreach в foreach, а затем удалить элемент из список, но я не мог понять это.

Просто используйте обычный цикл for и удалите, используя элемент из allCards на основе индекса.

Фрагмент кода:

public List<ImageView> getImageViews(List<Card> newCards){
    for (int i = 0; i < newCards.size(); i++) {
        String cardName = newCards.get(i).getName().toLowerCase();
        for (int j = 0; j < allCards.size(); j++){
            String imageName = allCards.get(j).getId().toLowerCase();
            if (imageName.equals(cardName)){
                allCards.remove(j);
                break;
            }
        }
    }
    return allCards;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...