1 Востаннє редагувалося colin200x (29.09.2023 22:54:13)

Тема: Видалити двійники з ArrayList об'єктів

Доброго дня всім. Підкажіть будь ласка, бо вже голова їде. не можу додумати.
В мене є ArrayList<Operation> arrList; Клас Operation має 2 поля code i text, тобто "схематично" мій аррейЛіст виглядає ось так:

arrList.get(0) 100 текст1
arrList.get(1) 110 текст1
arrList.get(2) 150 текст2
arrList.get(3) 100 текстекст
arrList.get(4) 300 текст3
arrList.get(5) 100 текст1

Як можна забрати з цього ліста двійники, але ті двійники в яких тільки поле text одинакове?
тобто з цього прикладу мені треба забрати елемент 5.
Дуже вдячний за відповіді!

2

Re: Видалити двійники з ArrayList об'єктів

але ті двійники в яких тільки поле text одинакове?

arrList.get(0) 100 текст1
arrList.get(1) 110 текст1
arrList.get(2) 150 текст2
arrList.get(3) 100 текстекст
arrList.get(4) 300 текст3
arrList.get(5) 100 текст1

у вас таких одинакових полів 3 а забрати ви хочете

мені треба забрати елемент 5.

лише один елемент, і два залишити!
у вас протиріччя!

3 Востаннє редагувалося vitek (30.09.2023 00:26:12)

Re: Видалити двійники з ArrayList об'єктів

code
public class test{
    
    public static void main(String[] args){
        List<Operation> arrList = new ArrayList<>(Arrays.asList(
            new Operation(100,"text1"), new Operation(110,"text1"), new Operation(150,"text2"), new Operation(100,"texttext"), new Operation(100,"text1")));
        arrList.forEach(System.out::println);
        System.out.println("-----------------");
        arrList.stream().distinct().forEach(System.out::println);
    }
    static class Operation {
        int code;
        String text;
        public Operation(int code,String text){
            this.code=code;
            this.text=text;
        }

        @Override
        public int hashCode(){
            int hash=7;
            hash=61*hash+Objects.hashCode(this.text);
            return hash;
        }

        @Override
        public boolean equals(Object obj){
            if(this==obj){
                return true;
            }
            if(obj==null){
                return false;
            }
            if(getClass()!=obj.getClass()){
                return false;
            }
            final Operation other=(Operation)obj;
            if(!Objects.equals(this.text,other.text)){
                return false;
            }
            return true;
        }

        @Override
        public String toString(){
            return "Operation{"+"code="+code+", text="+text+'}';
        }   
    }
}
result

Operation{code=100, text=text1}
Operation{code=110, text=text1}
Operation{code=150, text=text2}
Operation{code=100, text=texttext}
Operation{code=100, text=text1}
-----------------
Operation{code=100, text=text1}
Operation{code=150, text=text2}
Operation{code=100, text=texttext}

короче, я відкливаю свою відповідь(в самого голова вже не працює)
Якщо нормально переоприділити іквалс по 2-м полям(а не 1 як в мене), то і вийде потрібний вам результат..
Але я все рівно не розумію вашого формулювання питання.

Подякували: colin200x1

4

Re: Видалити двійники з ArrayList об'єктів

Дякую за відповідь. Попробую вашу реалізацію

короче, я відкливаю свою відповідь(в самого голова вже не працює)
Якщо нормально переоприділити іквалс по 2-м полям(а не 1 як в мене), то і вийде потрібний вам результат..
Але я все рівно не розумію вашого формулювання питання.

5 Востаннє редагувалося colin200x (30.09.2023 11:35:49)

Re: Видалити двійники з ArrayList об'єктів

Для себе рішення знайшов, спочатку відсортувати масив по коду, а потім видаляти  ті елементи яких опис повторяється, але код може бути один і той самий.
Або.... з цього аррею створити hashMap де ключом буде поле ОПИС і все...

6

Re: Видалити двійники з ArrayList об'єктів

colin200x написав:

Дякую за відповідь. Попробую вашу реалізацію

короче, я відкливаю свою відповідь(в самого голова вже не працює)
Якщо нормально переоприділити іквалс по 2-м полям(а не 1 як в мене), то і вийде потрібний вам результат..
Але я все рівно не розумію вашого формулювання питання.

На справді немає ніякої моєї реалізації. Весь Override я звісно генерував а не писав, і вже при генерації вибираєте що враховувати(які властивості) при іквелс та хешкоді а які ні. В мене вчора була подібна проблема, з 4-х полів LocalDate в іквелс вибирав чи перетинаються два періоди за днями, забув прикрутити "плюс/мінус день" бо isBefore/isAfter працюють виключно тих самих днів.

7

Re: Видалити двійники з ArrayList об'єктів

colin200x написав:

Для себе рішення знайшов, спочатку відсортувати масив по коду, а потім видаляти  ті елементи яких опис повторяється, але код може бути один і той самий.
Або.... з цього аррею створити hashMap де ключом буде поле ОПИС і все...

Сортувати а потім переписувати важка/трудозатратна робота.
Ось, виводить все крім останнього, перегенерувати - пару секунд.

code
public class test{
    
    public static void main(String[] args){
        List<Operation> arrList = new ArrayList<>(Arrays.asList(
            new Operation(100,"text1"), new Operation(110,"text1"), new Operation(150,"text2"), new Operation(100,"texttext"), new Operation(100,"text1")));
        arrList.forEach(System.out::println);
        System.out.println("-----------------");
        arrList.stream().distinct().forEach(System.out::println);
    }
    static class Operation {
        int code;
        String text;
        public Operation(int code,String text){
            this.code=code;
            this.text=text;
        }

        @Override
        public int hashCode(){
            int hash=7;
            return hash;
        }

        @Override
        public boolean equals(Object obj){
            if(this==obj){
                return true;
            }
            if(obj==null){
                return false;
            }
            if(getClass()!=obj.getClass()){
                return false;
            }
            final Operation other=(Operation)obj;
            if(this.code!=other.code){
                return false;
            }
            if(!Objects.equals(this.text,other.text)){
                return false;
            }
            return true;
        }
        @Override
        public String toString(){
            return "Operation{"+"code="+code+", text="+text+'}';
        }   
    }
}
Прихований текст

Operation{code=100, text=text1}
Operation{code=110, text=text1}
Operation{code=150, text=text2}
Operation{code=100, text=texttext}
Operation{code=100, text=text1}
-----------------
Operation{code=100, text=text1}
Operation{code=110, text=text1}
Operation{code=150, text=text2}
Operation{code=100, text=texttext}

Подякували: colin200x1