超高效率的处理 两个集合

11 篇文章 0 订阅

 一种是for循环方式,一种是 stream 方式;在处理数据量很大是会相差上

处理数据量大时,使用stream 方式,很小的数据用for就可以;

处理100000条数据处理结果:

方式耗时
for循环16683ms
stream 方式26ms 

处理100条数据处理结果:

方式耗时
for循环1ms
stream 方式3ms 

示例代码:kotlin

import java.util.*
import java.util.stream.Collectors
import kotlin.collections.ArrayList


class Test {

    companion object {
        private var i0 = 0
        private var i02 = 0
        private var i1 = 0



        @JvmStatic
        fun main(args: Array<String>) {
            println("---------START---------")
            val i=99999
//              val i = 99

            val r = Random()
            val sList = ArrayList<String>()
            for (i in 0..i) {
                sList.add(java.lang.String.valueOf(r.nextInt(500000) + 1))
            }
            val cList = ArrayList<String>()
            for (i in 0..i) {
                cList.add((i + 1).toString())
            }
            val s1 = System.currentTimeMillis()
            doubleForMethod(sList, cList)
            val e1 = System.currentTimeMillis()
            println("FOR--->" + (e1 - s1) + "ms ---->" + i0)
            val s2 = System.currentTimeMillis()
            streamMethod(sList, cList)
            val e2 = System.currentTimeMillis()
            println("STREAM--->" + (e2 - s2) + "ms ---->" + i1)
            val s3 = System.currentTimeMillis()
            doubleForMethod2(sList, cList)
            val e3 = System.currentTimeMillis()
            println("FOR 2 --->" + (e3 - s3) + "ms ---->" + i02)

            println("----------END--------")
        }

        private fun streamMethod(sList: List<String>, aList: List<String>) {
            // 把班级列表转成map,那么班级id就是唯一的id
            val noClassMap: Map<String, String> =
                aList.stream().collect(Collectors.toMap({ t -> t }) { t -> t })
            sList.stream().forEach { h: String ->
                if (noClassMap.containsKey(h)) {
                    i1++
                }
            }
        }
        // for双层循环的方式
        private fun doubleForMethod(sList: List<String>, aList: List<String>) {
            for (i in sList.indices) {
                val student = sList[i]
                for (j in aList.indices) {
                    val noClass = aList[j]
                    if (student == noClass) {
                        i0++
                    }
                }
            }
        }
        // for双层循环的方式
        private fun doubleForMethod2(sList: List<String>, aList: List<String>) {
            sList.forEach {
                if (aList.contains(it)) {
                    i02++
                }
            }
        }
    }
}
            

示例代码:Java

public class Run {
    private static  int i0=0;
    private static  int i1=0; 
    public static void main(String[] args) {
        Random r = new Random();
        ArrayList sList = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            sList.add(String.valueOf(r.nextInt(500000) + 1));
        }
        ArrayList cList = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            cList.add(String.valueOf(i + 1));
        }
        long s1 = System.currentTimeMillis();
        doubleForMethod(sList, cList);
        long e1 = System.currentTimeMillis();
        System.out.println("FOR--->" + (e1 - s1) + "---->" + i0);
        long s2 = System.currentTimeMillis();
        streamMethod(sList, cList);
        long e2 = System.currentTimeMillis();

        System.out.println("STREAM--->" + (e2 - s2) + "---->" + i1);
)
    // for双层循环的方式
    private static void doubleForMethod(List<String> sList, List<String> fList) {

        for (int i = 0; i < sList.size(); i++) {
            String student = sList.get(i);
            for (int j = 0; j < fList.size(); j++) {
                String noClass = fList.get(j);
                if (student.equals(noClass)) {
                    i0++;
                }
            }
        }
    }
    private static void streamMethod(List<String> sList, List<String> fList) {
        // 把班级列表转成map,那么班级id就是唯一的id
        Map<String, String> noClassMap = fList.stream().collect(Collectors.toMap(t -> t, t -> t));

        sList.stream().forEach(h -> {
            if (noClassMap.containsKey(h)) {

                i1++;
            }
        });
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是一段效率超高的文件拷贝代码: ``` #include <stdio.h> int main() { FILE *source, *destination; char buffer[4096]; size_t bytes_read; source = fopen("source_file.txt", "rb"); if (source == NULL) { printf("Unable to open source file.\n"); return 1; } destination = fopen("destination_file.txt", "wb"); if (destination == NULL) { printf("Unable to create destination file.\n"); return 1; } while ((bytes_read = fread(buffer, 1, sizeof(buffer), source)) > ) { fwrite(buffer, 1, bytes_read, destination); } fclose(source); fclose(destination); printf("File copied successfully.\n"); return ; } ``` ### 回答2: 以下是一个效率超高的文件拷贝代码示例: ```python import shutil import os import time def copy_file(source, destination): start_time = time.time() if os.path.isdir(source): shutil.copytree(source, destination) else: shutil.copy2(source, destination) end_time = time.time() duration = end_time - start_time print(f"文件拷贝完成,用时 {duration} 秒") source_file = "path/to/source/file.ext" destination_file = "path/to/destination/file.ext" copy_file(source_file, destination_file) ``` 这个代码使用了`shutil`库提供的`copy2`和`copytree`函数,这两个函数都是高效的文件拷贝方法。`copy2`用于拷贝单个文件,而`copytree`用于拷贝整个文件夹。 代码中使用了`os.path.isdir`函数来判断源文件是否是文件夹。如果是文件夹,则调用`copytree`函数进行拷贝,否则使用`copy2`函数进行拷贝。 代码还使用了`time`模块来计算拷贝文件所用的时间,并在拷贝完成后打印出来。 你只需要将`source_file`和`destination_file`变量的值替换为你实际的源文件和目标文件的路径即可使用这段高效的文件拷贝代码。 ### 回答3: 以下是一个效率较高的文件拷贝代码的例子: ```python import shutil import os import time def copy_file(source_dir, target_dir): if not os.path.exists(target_dir): os.makedirs(target_dir) file_list = os.listdir(source_dir) for file_name in file_list: source_file = os.path.join(source_dir, file_name) target_file = os.path.join(target_dir, file_name) start_time = time.time() shutil.copy2(source_file, target_file) end_time = time.time() execution_time = end_time - start_time print(f"已拷贝文件: {file_name} - 用时: {execution_time} 秒") source_directory = "/path/to/source_directory" # 设置源目录 target_directory = "/path/to/target_directory" # 设置目标目录 copy_file(source_directory, target_directory) ``` 该代码使用了`os.makedirs()`函数来创建目标目录(如果不存在),并利用`os.listdir()`函数获取源目录下的文件列表。之后,使用`shutil.copy2()`函数将源目录中的文件复制到目标目录中。 在每次拷贝文件之前,代码使用`time.time()`函数获取当前时间作为开始时间。在拷贝完成后,再次使用`time.time()`函数获取当前时间作为结束时间。计算时间差值即可得到该文件的拷贝耗时。最后,代码打印出每个文件的名称和拷贝所用的时间。 这种实现方式的优点在于它利用了`shutil.copy2()`函数,该函数既能够复制文件,还能够保留文件的元数据(例如创建时间和修改时间)。这样可以确保拷贝后的文件与原文件保持一致。同时,利用时间差值计算文件的拷贝耗时,可以提供一定的监控信息。 请根据实际需要修改源目录和目标目录的路径,然后运行代码即可实现高效的文件拷贝。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夢鑰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值