ArrayList - считать, если один и тот же объект указан в списке 2 раза и если: добавьте в "tempFinalFilterSearchList" - PullRequest
0 голосов
/ 08 декабря 2018

В основном я пытаюсь просмотреть Arraylist, чтобы проверить, указан ли один и тот же объект в списке 2 раза, и если: добавьте в «tempFinalFilterSearchList»

Мне не разрешено использовать Hashmap (школьное задание).

ОБНОВЛЕНИЕ - Этот код действительно работает сейчас ... Теперь мне просто нужно удалить дубликаты из "tempFinalFilterSearchList"

public List<Venue> filterToFinalSearchList()
        {

            for (int i=0; i < tempFilterSearchList.size(); i++)
            {

                int occurences=0;

                for (int j = 0; j < tempFilterSearchList.size(); j++)
                {

                    if (tempFilterSearchList.get(i).getVenueId() == tempFilterSearchList.get(j).getVenueId())
                    {
                        occurences++;
                    }

                }

                if (occurences == 2)
                {
                    tempFinalFilterSearchList.add(tempFilterSearchList.get(i));
                }
            }
            return tempFinalFilterSearchList;
        }
  • , если тот же идентификатор места равенперечислены точно 2 раза в "tempfilterSearchList", затем объект должен быть добавлен в "tempFinalFilterSearchList" ...

  • пробовал несколько разных вещей сейчас, без удачи - А также поиск здесь /Google - есть много решений, но все с Hashmap, который я не могу использовать.

Заранее благодарю за любые советы.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Лучше продвинутый вариант использовать 'итератор', поскольку он позволяет удалять элементы при итерации массива

ArrayList<Integer> tempFilterSearchList = new ArrayList<Integer>(Arrays.asList(1,2,5,3,7,3,7,3) );
    Iterator itr = tempFilterSearchList.iterator();
    while (itr.hasNext())
    {
        int count = 0;
        int number = (Integer)itr.next();
        for (int i=0; i < tempFilterSearchList.size(); i++)
        {
            int x = tempFilterSearchList.get(i);
            if (x == number)
            {
                count++;
            }
        }
        if( count != 3 )
        {
            itr.remove();
        }
    }

", используя функцию удаления внутри цикла для одного и того же списка небезопасно.«Это не будет проблемой, если вы используете итератор в Java, который является опцией продвинутого уровня в языке Java

0 голосов
/ 08 декабря 2018

Прежде всего, имейте в виду, что использование функции удаления внутри цикла для одного и того же списка небезопасно (если не используется итератор).Я предполагаю, что у вас есть класс, назовем его A с атрибутом venueId .Это выглядит примерно так + другие необходимые вам атрибуты:

public class A {
    private int venueId;

    public A(int venueId) {
        this.venueId = venueId;
    }

    public int getVenueId() {
        return venueId;
    }

    public void setVenueId(int venueId) {
        this.venueId = venueId;
    }
}

1.Создайте функцию, которая анализирует список и считает количество повторений объекта с одинаковым venueId .

public boolean doesVenueIdRepeatInList(int venueId, List<A> list) {
    int timesRepeated = 0;

    //Parse the list and count the number of items that have the same venueId
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).getVenueId() == venueId) {
            timesRepeated++;
        }
    }

    //If the venueId repeats more than 3 times
    if (timesRepeated >= 3) {
        return true;
    }
    return false;
}

3. Теперь код, который на самом деле выполняет то, что вы просили.Мы проанализируем список и определим объекты, которые повторяются более 3 раз.Если они повторятся более 3 раз, мы не добавим их в новый список

List<A> tempFilterSearchList = Arrays.asList(
        new A(1),
        new A(2),
        new A(1),
        new A(2),
        new A(3),
        new A(1),
        new A(2)
);

//We will be using a new list to put the result in
//It's not safe to use the delete function inside a loop
List<A> filteredList = new ArrayList<>();

//Count the number an object repeats and if it repeats more than 3 times store it inside repeatedVenueIds
for (int i=0; i < tempFilterSearchList.size(); i++)
{
    int venueId = tempFilterSearchList.get(i).getVenueId();
    boolean itRepeat3Times = doesVenueIdRepeatInList(venueId, tempFilterSearchList);

    //If it doesn't repeat more than 3 times add it to the new list
    if(!itRepeat3Times) {
        filteredList.add(tempFilterSearchList.get(i));
    }
}

Ваш результат будет внутри FilterList

0 голосов
/ 08 декабря 2018

Ваш код должен выглядеть следующим образом.Прежде всего вы должны перебрать все элементы в tempFilterSearchList.Затем для каждого элемента вы должны посчитать, сколько раз он появляется в списке.Я предпочел разместить все позиции, в которых происходит размещение элементов текущего элемента, в отдельном списке для дальнейшего их простого удаления.

ArrayList<Integer> occurrences = new ArrayList<Integer>()
for (int i=0; i < tempFilterSearchList.size(); i++)
    for (int j=0; j < tempFilterSearchList.size(); j++){
        if(tempFilterSearchList.get(i).getVenueId() ==tempFilterSearchList.get(j).getVenueId()){
            occurrences.add(j)
        }
    }

    if(occurrences.size() != 3){
        for(int j:occurrences){
            tempFilterSearchList.remove(occurrences[j])
        }     
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...