import java.util.ArrayList; import java.util.List; /** * 位图法 * 用于整型数组判重复,得到无重复列表 * */ public class Bit{ int max; int min; int[] arr; public Bit(int[] arrInput){ // 找出极值 for(int i=0;i<arrInput.length;i++){ if(max<arrInput[i]){ max=arrInput[i]; } if(min>arrInput[i]){ min=arrInput[i]; } } // 新建数组 arr=new int[max-min+1]; // 数组插值 for(int i:arrInput){ int index=i-min; arr[index]++; } } /** * 判断有无元素重复 * @return */ public boolean hasDuplicateItem(){ for(int i=0;i<arr.length;i++){ int value=arr[i]; if(value>1){ return true; } } return false; } /** * 得到已排序的元素列表,有重复 * @return */ public List<Integer> getSortedList(){ List<Integer> ls=new ArrayList<Integer>(); for(int i=0;i<arr.length;i++){ int value=arr[i]; if(value!=0){ for(int j=0;j<value;j++){ ls.add(min+i); } } } return ls; } /** * 得到已排序的元素列表,无重复 * @return */ public List<Integer> getUniqueSortedList(){ List<Integer> ls=new ArrayList<Integer>(); for(int i=0;i<arr.length;i++){ int value=arr[i]; if(value!=0){ ls.add(min+i); } } return ls; } public static void main(String[] args){ int[] arr={-2,-1,3,5,7,9,30,4,-2,5,8,3}; Bit b=new Bit(arr); System.out.print("排序后数组(有重复)为:"); for(int i:b.getSortedList()){ System.out.print(i+","); } System.out.println(); System.out.print("排序后数组(无重复)为:"); for(int i:b.getUniqueSortedList()){ System.out.print(i+","); } System.out.println(); String str=(b.hasDuplicateItem())?"有":"无"; System.out.println("数组arr"+str+"重复元素."); int[] arr2={9,8,7,2}; str=(new Bit(arr2).hasDuplicateItem())?"有":"无"; System.out.println("数组arr2"+str+"重复元素."); } }
输出:
排序后数组(有重复)为:-2,-2,-1,3,3,4,5,5,7,8,9,30, 排序后数组(无重复)为:-2,-1,3,4,5,7,8,9,30, 数组arr有重复元素. 数组arr2无重复元素.