1. 程式人生 > >list排序,list去重

list排序,list去重

package com.ck.test;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import org.junit.Assert;
import org.junit.Test;

import com.ck.test.modal.Student;
import com.ck.test.util.ListSort;

/*
 * 對list去重
 * 
 */
public class TestList {

	//去除set中重複資料的方法
	private static Set<Student> removeDuplicate(Set<Student> set) {
	    Map<String, Student> map = new HashMap<String, Student>();
	    Set<Student> tempSet = new HashSet<Student>();
	         for(Student p : set) {
	              if(map.get(p.getName()) == null ) {
	                   map.put(p.getName(), p);                        
	              } else {
	                   tempSet.add(p);
	              }
	          }
	    set.removeAll(tempSet);
	    return set;
	}
	
	public static String outCollection(Collection coll) { 
        StringBuffer sb = new StringBuffer(); 
        for (Object obj : coll) { 
            sb.append(obj + "," ); 
        }
        System.out.println(sb.toString()); 
        return sb.toString(); 
    } 
	
	/*
	 * 對list去重 list with dup:[1, 2, 3, 1] list without dup:[3, 2, 1]
	 */
	@Test
	public void distinctListValue() {
		List<String> listWithDup = new ArrayList<String>();
		listWithDup.add("1");
		listWithDup.add("2");
		listWithDup.add("4");
		listWithDup.add("3");
		listWithDup.add("1");

		List<String> listWithoutDup = new ArrayList<String>(new HashSet<String>(listWithDup));
		System.out.println("list with dup:" + listWithDup);
		System.out.println("list without dup:" + listWithoutDup);
		System.out.println("list去重後(去掉重複的值,並保留重複值中一個值及其他不重複的值/排序) :\n" + (new ListSort<String>()).distinctListValue(listWithDup));
		
		Collections.sort(listWithoutDup);
		 Collections.reverse(listWithoutDup);  //按照age降序 23,22   
		System.out.println(listWithoutDup);
	}
	
	@Test
	public void test2() {
		List<String> list = new ArrayList();
		list.add("王碩");
		list.add("劉媛媛");
		list.add("李明1");
		list.add("李明2");
		list.add("李明");
		list.add("劉迪");
		list.add("劉布2");
		list.add("李明");
		list.add("劉布8");
		list.add("劉布");
		list.add("劉布");
		list.add("3");
		list.add("4");
		list.add("4");
		list.add("2");
		list.add("4");
		list.add("1");
		
		System.out.println((new ListSort<String>()).distinctListValue(list));
		for(int i=0;i<list.size();i++) {
			System.out.print(list.get(i) +",");
		}
		System.out.println("");
		//升序
		Collections.sort(list,Collator.getInstance(java.util.Locale.CHINA));//注意:是根據的漢字的拼音的字母排序的,而不是根據漢字一般的排序方法
		for(int i=0;i<list.size();i++) {
		    System.out.print(list.get(i) +",");
		}
		System.out.println("");

		//降序
		Collections.reverse(list);//不指定排序規則時,也是按照字母的來排序的
		for(int i=0;i<list.size();i++) {
		     System.out.print(list.get(i) +",");
		}
	}

	/**
	 * 取出list中重複的Student物件
	 */
	@Test
	public void ObtainListEquals() {
		// 原始資料
		List<Student> list = new ArrayList<>();
		// 重複資料
		List<Student> list2 = new ArrayList<>();

		// 填充
		for (int i = 0; i < 10; i++) {
			list.add(new Student(i, "_" + i, 18 + i));
			Random random = new Random();
			if (random.nextBoolean()) {
				list.add(new Student(i, "_" + i, 18 + i));
			}
		}

		// 使用hashset去重複,set為重複的集合,可以通過new ArrayList(set)轉換成list
		HashSet<Student> set = new HashSet<>();
		
		// 去掉重複的值,只保留其他不重複的物件
		for (Student student : list) {
			boolean add = set.add(student);
			if (!add) {
				list2.add(student);
			}
		}

		List<Student> listWithoutDup = new ArrayList<Student>(new HashSet<Student>(list));
		System.out.println("list初始化:\n" + list);
		System.out.println("list去重後(重複的物件):\n" + list2);
		System.out.println("list去重後(去掉重複的值,並保留重複值中一個值及其他不重複的值):\n" + listWithoutDup);
		
		System.out.println("list去重後(去掉重複的值,並保留重複值中一個值及其他不重複的值/排序) :\n" + (new ListSort<Student>()).sortObjDistinctList(list, "getId", "desc"));
		ListSort<Student> listSort= new ListSort<Student>();  
		// 排序
        listSort.Sort(listWithoutDup, "getId", "");
//        listSort.Sort(listWithoutDup, "getId", "");
        
        System.out.println("list去重後(去掉重複的值,並保留重複值中一個值及其他不重複的值) 排序:\n" + listWithoutDup);
        
		Set<Student> set2 = new HashSet<Student>(list);
		System.out.println("list without dup:" + removeDuplicate(set2));
		// 比較
		Assert.assertEquals(list.size(), list2.size() + set.size());
	}
}