• ArrayList去除重复元素


    去除一个ArrayList的重复元素有两种方法:(ArrayList与Vector的存储结构是Object[],LinkedList是双向列表)

      第一种是不需要借助临时list,用equals方法比较ArrayList中数据,两次遍历原来list;

      第二种是借助一个临时ArrayList,向临时List添加数据,调用arrayList.contains(obj)判断是否存在

      了解ArrayList的contains原理:调用obj的equals方法进行判断在ArrayList中的位置是否大于零,进而判断是否存在。

        public boolean contains(Object o) {
            return indexOf(o) >= 0;
        }
    
        /**
         * Returns the index of the first occurrence of the specified element
         * in this list, or -1 if this list does not contain the element.
         * More formally, returns the lowest index <tt>i</tt> such that
         * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
         * or -1 if there is no such index.
         */
        public int indexOf(Object o) {
            if (o == null) {
                for (int i = 0; i < size; i++)
                    if (elementData[i]==null)
                        return i;
            } else {
                for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i]))
                        return i;
            }
            return -1;
        }

    1.  两种方式对ArrayList中重复字符串的处理:

    @Test
        // 第一种去重复方法
        public void Test1() {
            List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            list.add("3");
            list.add("4");
            list.add("4");
            list.add("3");
            list.add("2");
            list.add("1");
            System.out.println("去重复元素之前:");
            for (String s : list) {
                System.out.println(s);
            }
            // 遍历ArrayList
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    if (list.get(i).equals(list.get(j))) {
                        list.remove(j);
                    }
                }
            }
            System.out.println(list.size());
            System.out.println("去重复元素之后:");
            for (String s : list) {
                System.out.println(s);
            }
        }
    
        @Test
        // 第二种去重复方法
        public void Test2() {
            List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            list.add("3");
            list.add("4");
            list.add("4");
            list.add("3");
            list.add("2");
            list.add("1");
            List<String> temp = new ArrayList<String>();
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String str = iterator.next();
                if (!temp.contains(str)) {
                    temp.add(str);
                }
            }
            for (String s : temp) {
                System.out.println(s);
            }
        }

    2.  两种方式对ArrayList中重复对象的处理:

    Person.java   重写equals方法

    package cn.xm.exam.test.javaTest;
    
    import static org.hamcrest.CoreMatchers.instanceOf;
    
    public class Person {
    
        private String name;
        private String id;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Person(String name, String id) {
            super();
            this.name = name;
            this.id = id;
        }
    
        // 重写一个Bean的hashCode方法
        /*
         * @Override public int hashCode() { // TODO Auto-generated method stub
         * return this.name.hashCode()+this.id.hashCode(); }
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof Person)) {
                throw new ClassCastException();// 类型错误
            }
            Person pp = (Person) obj;
            return this.getId().equals(pp.getId()) && this.getName().equals(pp.getName());
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", id=" + id + "]";
        }
    
    }

    去重算法:

    @Test
        // 第一种去重复方法去除Object重复的
        public void Test3() {
            List<Person> list = new ArrayList<Person>();
            list.add(new Person("张三", "1"));
            list.add(new Person("张三", "2"));
            list.add(new Person("张三", "3"));
            list.add(new Person("张三", "4"));
            list.add(new Person("李四", "1"));
            list.add(new Person("李四", "2"));
            list.add(new Person("张三", "1"));
            list.add(new Person("李四", "1"));
            // 遍历ArrayList
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    if (list.get(i).equals(list.get(j))) {
                        list.remove(j);
                    }
                }
            }
            for (Person p : list) {
                System.out.println(p);
            }
        }
    
        @Test
        // 第二种去重复方法去除Object重复的
        public void Test4() {
            List<Person> list = new ArrayList<Person>();
            list.add(new Person("张三", "1"));
            list.add(new Person("张三", "2"));
            list.add(new Person("张三", "3"));
            list.add(new Person("张三", "4"));
            list.add(new Person("李四", "1"));
            list.add(new Person("李四", "2"));
            list.add(new Person("张三", "1"));
            list.add(new Person("李四", "1"));
            List<Person> temp = new ArrayList<Person>();
            Iterator<Person> iterator = list.iterator();
            while (iterator.hasNext()) {
                Person person = iterator.next();
                if (!temp.contains(person)) {
                    temp.add(person);
                }
            }
            for (Person p : temp) {
                System.out.println(p);
            }
        }

    结果:

    Person [name=张三, id=1]
    Person [name=张三, id=2]
    Person [name=张三, id=3]
    Person [name=张三, id=4]
    Person [name=李四, id=1]
    Person [name=李四, id=2]
  • 相关阅读:
    [linux] ARCH LINUX 常见问题及实用工具汇总
    [TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法浅谈
    [小黑科技] 破解一个电控升降桌,并改造成语音控制(上)—— 模拟中间人与控制手柄交互
    [蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD)
    [Node.js] 3、搭建hexo博客
    [IOT] 自制蓝牙工牌办公室定位系统 (二)—— 基于ESP32的蓝牙信号扫描系统
    [IOT] 自制蓝牙工牌办公室定位系统 (一)—— 阿里物联网平台概览及打通端到云(硬核&#183;干货)
    [python] PyMouse、PyKeyboard用python操作鼠标和键盘
    [python] bluepy 一款python封装的BLE利器
    [安卓] 20、基于蓝牙BLE的广播包高频快速搜索
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7755938.html
Copyright © 2020-2023  润新知