`
tanglingshuai
  • 浏览: 36686 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

两个列表比较取相同值

 
阅读更多

  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.OutputStreamWriter;  
  6. import java.util.ArrayList;  
  7. import java.util.Arrays;  
  8. import java.util.LinkedHashSet;  
  9. import java.util.List;  
  10. import java.util.Random;  
  11.   
  12.   
  13. public class ListCompare {  
  14.       
  15.     //传入两个元素之间可相互比较的列表, 从两个列表中选择相同的元素组成新列表返回  
  16.     @SuppressWarnings("unchecked")  
  17.     public static List<Comparable<?>> getSameList(List<Comparable<?>> list1, List<Comparable<?>> list2){  
  18.         List<Comparable<?>> result = new ArrayList<Comparable<?>>();  
  19.         //先转为数组排序  
  20.         Object[] c1 = list1.toArray();   
  21.         Object[] c2 = list2.toArray();  
  22.         //O(nlog(n))  
  23.         Arrays.sort(c1);  
  24.         Arrays.sort(c2);  
  25.         int len = c1.length;  
  26.         //两个指针,当a>b时, 指向b的指针向后移;反正,当a<b时,指向a的指针向后移  
  27.         int i=0,j=0;  
  28.         //不会超过O(2n)  
  29.         for(int k=0;k<len;k++){  
  30.             Comparable a = (Comparable)c1[i];  
  31.             Comparable b = (Comparable)c2[j];  
  32.             if(a.compareTo(b)==0){  
  33.                 i++;  
  34.                 j++;  
  35.                 result.add(a);  
  36.             }  
  37.             else if(a.compareTo(b)<0) {  
  38.                 i++;  
  39.             }else {  
  40.                 j++;  
  41.             }  
  42.         }  
  43.         //去掉重复的  
  44.         return new ArrayList(new LinkedHashSet(result));  
  45.     }  
  46.       
  47.     static Random random = new Random();  
  48.     //获取随机字符串,长度1~5,由小写字母组成  
  49.     private static String getRandomString(){  
  50.         int len = random.nextInt(5)+1;  
  51.         char[] chs = new char[len];  
  52.         for(int i=0;i<len;i++){  
  53.             chs[i]=(char)('a'+random.nextInt(26));  
  54.         }  
  55.         return new String(chs);  
  56.     }  
  57.       
  58.     //打印列表  
  59.     private static void printList(List<?> list){  
  60.         if(list == null){  
  61.             System.out.println("null");  
  62.         }  
  63.         for(Object object :list){  
  64.             System.out.print(object+"\t");  
  65.         }  
  66.         System.out.println();  
  67.     }  
  68.       
  69.     //生成由随机字符串组成的列表  
  70.     private static List<Comparable<?>> generateRandomList(int len){  
  71.         List<Comparable<?>> l1 = new ArrayList<Comparable<?>>();  
  72.         for(int i=0;i<len;i++){  
  73.             l1.add(getRandomString());  
  74.         }  
  75.         return l1;  
  76.     }  
  77.       
  78.       
  79.     //太大的不打印,写到文件自己查看吧  
  80.     @SuppressWarnings("unchecked")  
  81.     private static void writeListToTxt(List list,String path){  
  82.         Object[] arr = list.toArray();  
  83.         Arrays.sort(arr);  
  84.         int len = arr.length;  
  85.         StringBuilder sb = new StringBuilder(len);  
  86.         for(int i=0; i<len;i++){  
  87.             sb.append(arr[i]).append("\t");  
  88.         }  
  89.         File file = new File(path);  
  90.         OutputStreamWriter writer = null;  
  91.         try {  
  92.             if(!file.exists()){  
  93.                 file.createNewFile();  
  94.             }  
  95.             writer = new OutputStreamWriter(new FileOutputStream(file));  
  96.             writer.write(sb.toString());  
  97.         } catch (FileNotFoundException e) {  
  98.             e.printStackTrace();  
  99.         } catch (IOException e) {  
  100.             e.printStackTrace();  
  101.         }finally{  
  102.             if(writer!=null){  
  103.                 try {  
  104.                     writer.close();  
  105.                 } catch (IOException e) {  
  106.                     e.printStackTrace();  
  107.                 }  
  108.             }  
  109.         }  
  110.     }  
  111.     //超过1000行的就不打印了,大家随意  
  112.     private static boolean isPrintable(int len){  
  113.         return len<=1000;  
  114.     }  
  115.       
  116.     @SuppressWarnings("unchecked")  
  117.     public static void main(String[] args) {  
  118.         int len = 100000;  
  119.         List<Comparable<?>> l1 = generateRandomList(len);  
  120.         List<Comparable<?>> l2 = generateRandomList(len);  
  121.           
  122.         if(isPrintable(len)){  
  123.             System.out.println("the two list are here");  
  124.             printList(l1);  
  125.             printList(l2);  
  126.         }  
  127.           
  128.         writeListToTxt(l1, "C:\\l1.txt");  
  129.         writeListToTxt(l2, "C:\\l2.txt");  
  130.           
  131.           
  132.           
  133.         long start = System.currentTimeMillis();  
  134.         List<Comparable<?>> sameList = getSameList(l1, l2);  
  135.         long end = System.currentTimeMillis();  
  136.         System.out.println("spends "+(end-start)+" ms to make it done. "  
  137.                 +"\nthe sameList's size is "+sameList.size()  
  138.                 +"\nand the sameList elements are:");  
  139.         printList(sameList);  
  140.         //写到文件  
  141.         writeListToTxt(sameList, "C:\\same.txt");  
  142.     }  
  143. }  

分享到:
评论

相关推荐

    两个list比较 取不同的对象

    ### 两个List比较取不同的对象 在Java编程中,经常需要对两个`List`进行比较,找出它们之间的差异。这通常涉及到数据结构的理解、算法设计以及编程实现等多个方面。本文将详细探讨如何通过一个示例代码来理解如何...

    易语言-两个超级列表框取相同数据

    在易语言编程环境中,"两个超级列表框取相同数据"是一个常见的操作,特别是在处理大量信息对比或筛选时。超级列表框是一种控件,它允许程序员展示多列数据,并且提供了丰富的用户交互功能,如选择、排序等。在这个...

    两个List集合取相同重复数据的方法

    两个List集合取相同重复数据的方法 在Java编程中,集合操作是非常常见的,而在实际开发中,我们经常遇到需要从两个List集合中提取相同的重复数据的情况。这篇文章将为大家分享一个关于两个List集合取相同重复数据的...

    java计算同一个list中是否有相同的值

    ### Java 计算同一 List 中是否有相同值 在 Java 编程中,判断一个 `List` 中是否存在重复元素是一项常见的需求。特别是在数据处理、验证或分析等场景中,确保数据的唯一性对于维持数据完整性至关重要。 #### 核心...

    求一组数组的两个最大值和两个最小值 分治法

    ### 使用分治法求解数组中的两个最大值与两个最小值 #### 一、问题背景与目标 在算法设计实验中,有一道题目的要求是使用分治法(Divide and Conquer)来求解一个数组中的两个最大值与两个最小值。与蛮力法不同,...

    编写程序,输入两个分别包含若干整数的列表LA、LB.py

    最后,字典的大小将取决于两个列表中较短的那个,确保键值对一一对应。 首先,我们需要导入必要的模块,虽然在这个例子中,由于我们只使用了Python的基本功能,可能不需要导入任何模块。但为了良好的编程习惯,我们...

    搜索两个数组中相同的部分,并建立一个新数组

    比较两个数组的相同部分,实际上就是在寻找两个数组中存在相同值的元素。这涉及到对数组进行遍历,比较每个元素是否相等的过程。 ### 二、算法实现:搜索两个数组中相同的部分 #### 1. 双重循环法 代码片段中展示...

    C# 两个datatable中的数据快速比较返回交集 并集或差集

    2. **定义比较条件**:为了比较两个DataTable,通常需要基于相同的列和值。确保两个表有相同的列结构,并定义一个函数用于比较行。 ```csharp private bool AreRowsEqual(DataRow row1, DataRow row2) { // 检查...

    易语言两个编辑框内容比较

    这个命令会返回一个整数值,表示两个字符串的相对顺序。如果返回值为0,那么两个字符串相等;如果返回值为正,表示第一个字符串在字典顺序上大于第二个;负值则相反。 4. **查找相同数据**:在比较过程中,我们可以...

    python中比较两个列表的实例方法.docx

    例如,下面的示例代码展示了如何统计两个列表中相同位置上的元素相等的数量(`k1`)以及一个列表中的元素在另一个列表中出现但位置不同的数量(`k2`)。 示例代码如下: ```python import random a = [] b = [] ...

    易语言取随机数的两种方法比较

    本文将详细讨论易语言中取随机数的两种主要方法,并通过比较它们的特性与使用方式,帮助开发者更好地理解和选择合适的随机数生成策略。 首先,易语言提供了内置的随机数函数,通常称为“随机数”或“随机整数”。这...

    c#窗体应用程序两个列数相同的矩阵合并代码

    本示例将详细介绍如何在C#中合并两个列数相同的矩阵。 首先,我们来看提供的代码。这个例子定义了一个名为`Class1`的类,其中包含一个名为`zh_Matrix`的方法。这个方法的目的是将两个二维double类型的矩阵(N1和N2...

    wpf 两滑块取中间值 样式修改

    这里,我们为两个滑块设置了相同的最小值(0)和最大值(100),并且绑定了ValueChanged事件,当滑块值改变时触发。我们还需要一个TextBlock显示中间值。 接下来,我们需要在MainWindow.xaml.cs文件中实现...

    取两个集合的交集

    比较两个指针所指向的元素值,如果相等,则加入结果集;如果不等,则移动较小元素所在的指针。 - **哈希表法**:使用哈希表记录一个集合的所有元素,然后遍历另一个集合,检查其元素是否在哈希表中出现过。这种方法...

    SQL排除重复结果只取字段最大值分享

    要求得到的结果(即是PID相同的记录只取ID值最大的那一条)。 代码如下:select * from [Sheet1$] awhere ID not exists (select 1 from [Sheet1$] where PID=a.PID and ID&gt;a.ID) select a.* from [Sheet1$] a inner...

    Java中如何比较两个数组中元素是否相同

    在Java编程中,比较两个数组中元素是否相同是一项常见的...总的来说,比较两个数组中元素是否相同取决于具体的需求,包括数组是否有序、元素是否可排序以及比较的逻辑。在实际开发中,应根据具体情况选择合适的方法。

    给定一个精确整数,用分治法删除两个最大数两个最小数。

    2. **征服(Conquer)**:对这两个子数组分别进行相同的操作,即找到各自的最大值和最小值。对于子数组`left`,我们可以找到`left_max`和`left_min`;对于子数组`right`,找到`right_max`和`right_min`。 3. **合并...

    最大的两个数

    可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。 输出时要保留原矩阵的行列顺序,即在原矩阵中行...

    详解JS取出两个数组中的不同或相同元素

    在JavaScript中,处理数组是常见的任务之一,特别是比较和操作两个数组以找出它们之间的差异或相同元素。在本文中,我们将深入探讨如何使用JS来实现这个功能。 首先,我们要了解几种核心的数组方法,这些方法在处理...

    在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。

    关系运算符用于比较两个数据,判断它们之间的关系,包括小于 `、小于或等于 `、大于 `&gt;`、大于或等于 `&gt;=`、等于 `==` 和不等于 `!=` 六种。值得注意的是,等于运算符是双等号 `==`,而单等号 `=` 是赋值运算符。 ...

Global site tag (gtag.js) - Google Analytics