- 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");
- }
- }
两个列表比较取相同值
最新推荐文章于 2023-07-10 02:00:00 发布