两个列表比较取相同值 程序员文章站 2024-02-21 16:22:34 ... import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Random; public class ListCompare { //传入两个元素之间可相互比较的列表, 从两个列表中选择相同的元素组成新列表返回 @SuppressWarnings("unchecked") public static List<Comparable<?>> getSameList(List<Comparable<?>> list1, List<Comparable<?>> list2){ List<Comparable<?>> result = new ArrayList<Comparable<?>>(); //先转为数组排序 Object[] c1 = list1.toArray(); Object[] c2 = list2.toArray(); //O(nlog(n)) Arrays.sort(c1); Arrays.sort(c2); int len = c1.length; //两个指针,当a>b时, 指向b的指针向后移;反正,当a<b时,指向a的指针向后移 int i=0,j=0; //不会超过O(2n) for(int k=0;k<len;k++){ Comparable a = (Comparable)c1[i]; Comparable b = (Comparable)c2[j]; if(a.compareTo(b)==0){ i++; j++; result.add(a); } else if(a.compareTo(b)<0) { i++; }else { j++; } } //去掉重复的 return new ArrayList(new LinkedHashSet(result)); } static Random random = new Random(); //获取随机字符串,长度1~5,由小写字母组成 private static String getRandomString(){ int len = random.nextInt(5)+1; char[] chs = new char[len]; for(int i=0;i<len;i++){ chs[i]=(char)('a'+random.nextInt(26)); } return new String(chs); } //打印列表 private static void printList(List<?> list){ if(list == null){ System.out.println("null"); } for(Object object :list){ System.out.print(object+"\t"); } System.out.println(); } //生成由随机字符串组成的列表 private static List<Comparable<?>> generateRandomList(int len){ List<Comparable<?>> l1 = new ArrayList<Comparable<?>>(); for(int i=0;i<len;i++){ l1.add(getRandomString()); } return l1; } //太大的不打印,写到文件自己查看吧 @SuppressWarnings("unchecked") private static void writeListToTxt(List list,String path){ Object[] arr = list.toArray(); Arrays.sort(arr); int len = arr.length; StringBuilder sb = new StringBuilder(len); for(int i=0; i<len;i++){ sb.append(arr[i]).append("\t"); } File file = new File(path); OutputStreamWriter writer = null; try { if(!file.exists()){ file.createNewFile(); } writer = new OutputStreamWriter(new FileOutputStream(file)); writer.write(sb.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(writer!=null){ try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } //超过1000行的就不打印了,大家随意 private static boolean isPrintable(int len){ return len<=1000; } @SuppressWarnings("unchecked") public static void main(String[] args) { int len = 100000; List<Comparable<?>> l1 = generateRandomList(len); List<Comparable<?>> l2 = generateRandomList(len); if(isPrintable(len)){ System.out.println("the two list are here"); printList(l1); printList(l2); } writeListToTxt(l1, "C:\\l1.txt"); writeListToTxt(l2, "C:\\l2.txt"); long start = System.currentTimeMillis(); List<Comparable<?>> sameList = getSameList(l1, l2); long end = System.currentTimeMillis(); System.out.println("spends "+(end-start)+" ms to make it done. " +"\nthe sameList's size is "+sameList.size() +"\nand the sameList elements are:"); printList(sameList); //写到文件 writeListToTxt(sameList, "C:\\same.txt"); } } 上一篇: 啊这该这么办呢?解决方法 下一篇: 求研究discuz x3 源码分析顺序,该如何处理 推荐阅读 两个列表比较取相同值 两个列表比较取相同值 急用!怎么比较数据库中的两个表中 的内容,删除相同的数据,保留不一样的数据 for循环取出两个数组中的不同值和相同值 给定两个int a和b,不使用if-else等比较和判断运算符,请返回较大的一个数。若两数相同则返回任意一个 两个表联合查询,子表fid有相同的只取一条,怎么写sql语句 恳求帮忙,php比较两个二维数组并按键排序查出重复值。 js中比较两个对象是否相同的方法示例 恳求帮忙,php比较两个二维数组并按键排序查出重复值。 急用!怎么比较数据库中的两个表中 的内容,删除相同的数据,保留不一样的数据