当前位置:网站首页>List set data removal (list.sublist.clear)

List set data removal (list.sublist.clear)

2022-07-06 17:18:00 Xiaobai said (๑• ๑)

List Set data removal (List.subList.clear)

I have encountered such a problem these two days : A set of data is passed in as a parameter , Now? piecewise Use the data of this set , The used data needs to be removed from this set , It is convenient to obtain the data of the second paragraph .

hypothesis : The data length of a set is 11 individual , Now use this set in two paragraphs , The first paragraph uses 5 Data , Use of the second paragraph 6 Data , Achieve segmented use of set data . In order to get the data correctly , After obtaining the first data , Take the first five data from list Remove... From collection , Then get the second data , This also facilitates circulation .

At first I did this remove(), Remove data :

public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("g");
        list.add("h");
        list.add("i");
        //  Simulate to get the first five numbers in the first paragraph 
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
            list.remove(i);
        }
        //  After the simulation obtains the second paragraph 6 Number 
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
            list.remove(i);
        }
    }

because ArrayList It's not thread safe , It is obviously not appropriate to do this in the cycle , Problems are likely to occur in concurrency .

So I changed another way ,removeAll(), remove List Data in :


    public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("a");
        list.add("a");
        list.add("a");
        //  Simulate to get the first five numbers in the first paragraph 
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
        }
        list.removeAll(oneList);
        //  After the simulation obtains the second paragraph 6 Number 
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
        }
        list.removeAll(twoList);
    }

Notice that the data in the set has changed , This is also the change I found later :
 Insert picture description here

list Originally 11 Data , Take out 5 After that, there should be still 6 Data , however removeAll After that, there is still 3 Data , This must be wrong , Because this will make the array subscript out of bounds exception when obtaining the second segment of data .

Later, I found out by looking at the source code ,removeAll The same elements are removed .

Looking up the data, we found that using iterators will not remove duplicate elements , But the iterator is not the way I want to remove data , It can't achieve the effect I want .

Finally, we found that using subList() It is reliable to get a subset of the current set to remove , And there are no above two problems .

    public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("a");
        list.add("a");
        list.add("a");
        //  Simulate to get the first five numbers in the first paragraph 
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
        }
        //  Get subset clear data 
        List<String> subList_1 = list.subList(0, 5);
        subList_1.clear();
        //  After the simulation obtains the second paragraph 6 Number 
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
        }
        list.subList(0, 6).clear();
    }

At the end of the article, I want to explain subList Actions and parameters :

subList Is the method to get a subset of the current set

Parameters fromIndex: Specify the starting point of the new list ( Include this point )

Parameters toIndex: Specify the end point of the new list ( This point is not included )

Personally, it means subscript fromIndex Start taking value , take toIndex It's worth .

Refer to the connection

http://c.biancheng.net/view/4743.html

原网站

版权声明
本文为[Xiaobai said (๑• ๑)]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060928207909.html