【AI帮我写代码,上班摸鱼不是梦】如何调教ChatGPT,让它帮我写程序。

news2024/11/19 7:46:31

最近发现磁盘空间严重不足,都弹窗提示我了:

想想看到底哪个文件夹占的空间比较大,好做针对性的删除和清理。奈何Windows系统没有查看文件夹大小的工具,只能鼠标放在某个文件夹上,等提示:

AI时代都来临了,就让ChatGPT帮我写一个程序吧:计算指定文件夹中所有文件夹的大小并排序。

初版

于是,我就向ChatGPT提问:

完整的代码是这样的:

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class FolderSizeCalculator {
    public static void main(String[] args) {
        // 指定文件夹路径
        String folderPath = "/path/to/folder";

        // 获取文件夹列表
        File folder = new File(folderPath);
        File[] folderList = folder.listFiles(File::isDirectory);

        // 计算每个文件夹的大小并存储到ArrayList中
        ArrayList<Folder> folders = new ArrayList<>();
        for (File f : folderList) {
            long size = getFolderSize(f);
            Folder folderObj = new Folder(f.getName(), size);
            folders.add(folderObj);
        }

        // 根据文件夹大小进行排序
        Collections.sort(folders, Comparator.comparingLong(Folder::getSize));

        // 输出结果
        for (Folder f : folders) {
            System.out.println(f.getName() + " - " + formatSize(f.getSize()));
        }
    }

    // 递归计算文件夹大小
    public static long getFolderSize(File folder) {
        long size = 0;
        File[] fileList = folder.listFiles();
        if (fileList != null) {
            for (File f : fileList) {
                if (f.isFile()) {
                    size += f.length();
                } else {
                    size += getFolderSize(f);
                }
            }
        }
        return size;
    }

    // 格式化文件大小
    public static String formatSize(long size) {
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int i = 0;
        double s = size;
        while (s >= 1024 && i < units.length - 1) {
            s /= 1024;
            i++;
        }
        return String.format("%.2f %s", s, units[i]);
    }
}

// 文件夹类
class Folder {
    private String name;
    private long size;

    public Folder(String name, long size) {
        this.name = name;
        this.size = size;
    }

    public String getName() {
        return name;
    }

    public long getSize() {
        return size;
    }
}

使用File类获取指定文件夹中的所有子文件夹,然后使用递归函数getFolderSize计算每个文件夹的大小,最后将结果存储到一个ArrayList中。程序使用Collections.sort方法根据文件夹大小对ArrayList进行排序,并使用formatSize方法格式化文件大小并输出结果。

修改一下指定文件夹的路径就可以运行,效果还不错:

社 - 646.13 KB
学 - 141.15 MB
猫 - 587.99 MB
万 - 1.52 GB

唯一有一点小瑕疵,排序是从小到大的,稍微做一下修改,把

// 根据文件夹大小进行排序
Collections.sort(folders, Comparator.comparingLong(Folder::getSize));

修改为:

// 根据文件夹大小进行排序
Collections.sort(folders, (f1, f2) -> Long.compare(f2.getSize(), f1.getSize()));

运行一下,看看效果:

万 - 1.52 GB
猫 - 587.99 MB
学 - 141.15 MB
社 - 646.13 KB

进化

每次修改需要计算的文件夹路径时,都需要修改代码重新运行,很不方便。我想到了Swing,可以用UI进行交互。于是,我又向ChatGPT重新提问:

完整的代码如下:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;

public class FolderSizeSorter extends JFrame {
    private JLabel directoryLabel;
    private JTextField directoryTextField;
    private JButton calculateButton;
    private JTextArea resultTextArea;
    
    public FolderSizeSorter() {
        super("Folder Size Sorter");
        
        // set up UI components
        directoryLabel = new JLabel("Directory:");
        directoryTextField = new JTextField(20);
        calculateButton = new JButton("Calculate");
        resultTextArea = new JTextArea(20, 40);
        JScrollPane scrollPane = new JScrollPane(resultTextArea);
        
        // set up layout
        JPanel inputPanel = new JPanel();
        inputPanel.add(directoryLabel);
        inputPanel.add(directoryTextField);
        inputPanel.add(calculateButton);
        add(inputPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.CENTER);
        
        // set up event listeners
        calculateButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                calculateFolderSizes();
            }
        });
        
        // set up window properties
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 400);
        setVisible(true);
    }
    
    private void calculateFolderSizes() {
        String directoryPath = directoryTextField.getText();
        File directory = new File(directoryPath);
        if (!directory.isDirectory()) {
            JOptionPane.showMessageDialog(this, "Please enter a valid directory path.");
            return;
        }
        
        Map<File, Long> folderSizes = new HashMap<>();
        calculateFolderSizesRecursive(directory, folderSizes);
        
        List<Map.Entry<File, Long>> folderSizesList = new ArrayList<>(folderSizes.entrySet());
        Collections.sort(folderSizesList, new Comparator<Map.Entry<File, Long>>() {
            public int compare(Map.Entry<File, Long> o1, Map.Entry<File, Long> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        
        resultTextArea.setText("");
        for (Map.Entry<File, Long> folderSize : folderSizesList) {
            resultTextArea.append(folderSize.getKey().getPath() + " - " + formatSize(folderSize.getValue()) + "\n");
        }
    }
    
    private void calculateFolderSizesRecursive(File folder, Map<File, Long> folderSizes) {
        File[] files = folder.listFiles();
        if (files == null) {
            return;
        }
        long folderSize = 0;
        for (File file : files) {
            if (file.isDirectory()) {
                calculateFolderSizesRecursive(file, folderSizes);
                folderSize += folderSizes.get(file);
            } else {
                folderSize += file.length();
            }
        }
        folderSizes.put(folder, folderSize);
    }
    
    private String formatSize(long size) {
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double dSize = size;
        while (dSize >= 1024 && unitIndex < units.length - 1) {
            dSize /= 1024;
            unitIndex++;
        }
        return String.format("%.2f %s", dSize, units[unitIndex]);
    }
    
    public static void main(String[] args) {
        new FolderSizeSorter();
    }
}

创建了一个GUI窗口,包括一个标签、一个文本框、一个按钮,在文本框输入文件夹的路径,点击“Calculate”就可以了,效果如下图:

再进化

在使用过程中,又有了新的问题:我看到某一个文件夹比较大,想再看看这个文件夹下的文件夹大小情况,还得手动复制粘贴文件夹路径重新计算,操作起来不是很方便。于是,我又向ChatGPT重新提问:

完整的代码如下:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class FolderSizeCalculator extends JFrame {
    
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JButton btnSelectFolder;
    private JTree tree;
    private DefaultTreeModel treeModel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FolderSizeCalculator frame = new FolderSizeCalculator();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public FolderSizeCalculator() {
        setTitle("Folder Size Calculator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        btnSelectFolder = new JButton("Select Folder");
        btnSelectFolder.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int result = fileChooser.showOpenDialog(FolderSizeCalculator.this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File folder = fileChooser.getSelectedFile();
                    DefaultMutableTreeNode root = new DefaultMutableTreeNode(folder.getName());
                    treeModel = new DefaultTreeModel(root);
                    tree.setModel(treeModel);
                    calculateFolderSize(folder, root);
                    tree.expandRow(0);
                }
            }
        });
        contentPane.add(btnSelectFolder, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        tree = new JTree();
        scrollPane.setViewportView(tree);
    }

    private void calculateFolderSize(File folder, DefaultMutableTreeNode node) {
        long size = 0;
        List<File> subfolders = new ArrayList<>();
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                subfolders.add(file);
            } else {
                size += file.length();
            }
        }
        Collections.sort(subfolders);
        for (File subfolder : subfolders) {
            DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(subfolder.getName());
            node.add(subnode);
            calculateFolderSize(subfolder, subnode);
        }
        node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
    }

    private String humanReadableByteCount(long bytes, boolean si) {
        int unit = si ? 1000 : 1024;
        if (bytes < unit)
            return bytes + " B";
        int exp = (int) (Math.log(bytes) / Math.log(unit));
	    String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
	    return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
	}
}

这个程序中,创建了一个继承自JFrameFolderSizeCalculator类,并在其中创建了一个用户界面。

我们可以通过点击“Select Folder”按钮来选择要计算大小的文件夹。一旦用户选择了一个文件夹,程序将会计算该文件夹中所有文件夹的大小,并将结果以树形结构展示出来。

计算文件夹大小的方法是calculateFolderSize,它使用递归来遍历文件夹及其子文件夹,计算它们的大小。该方法将每个子文件夹作为一个节点添加到树中,并将文件夹大小添加到节点名称中。

humanReadableByteCount是一个辅助方法,用于将文件大小从字节转换为人类可读的格式(如MB、GB等)。

运行一下,看看效果:

发现了问题,子文件夹的大小反而比父文件夹的大,仔细阅读了一下代码发现:在calculateFolderSize方法中累加了文件的大小,没有累加子文件夹的大小。于是,我又向ChatGPT重新提问:

ChatGPT增加了一个calculateTotalSize方法:

private long calculateTotalSize(File folder) {
    long totalSize = 0;
    if (folder.isDirectory()) {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                totalSize += calculateTotalSize(file);
            } else {
                totalSize += file.length();
            }
        }
    } else {
        totalSize = folder.length();
    }
    return totalSize;
}

在该方法中,首先检查传递的文件夹是否是文件夹类型。如果是文件夹,则迭代遍历其所有子项,如果子项是文件夹,则递归调用该方法以计算其大小;如果子项是文件,则将其大小加到总大小中。如果传递的文件夹是文件,则直接返回其大小。最终,该方法返回总大小。

将以上方法集成到原有方法中,用于计算文件夹下所有文件和文件夹的大小总和。以下是修改后的示例代码:

private void calculateFolderSize(File folder, DefaultMutableTreeNode node) {
    long size = calculateTotalSize(folder);
    List<File> subfolders = new ArrayList<>();
    for (File file : folder.listFiles()) {
        if (file.isDirectory()) {
            subfolders.add(file);
        }
    }
    Collections.sort(subfolders);
    for (File subfolder : subfolders) {
        DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(subfolder.getName());
        node.add(subnode);
        calculateFolderSize(subfolder, subnode);
    }
    node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
}

我们可以发现ChatGPT修改后的代码性能不是很好,因为calculateFolderSize方法就是一个递归方法,在这个递归方法里还要对每个文件夹再做一次递归。

我们完全可以在一次递归中完成整个计算过程。于是,我又向ChatGPT重新提问:

很遗憾,我虽然给ChatGPT扣上了卓越的帽子,但回答仍然不理想。

只能自己动手了,把calculateFolderSize方法修改为:

private long calculateFolderSize(File folder, DefaultMutableTreeNode node) {
    long size = 0;
    Map<DefaultMutableTreeNode, Long> nodeMap = new HashMap<>();
    for (File file : folder.listFiles()) {
        if (file.isDirectory()) {
            DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(file.getName());
            long subSize = calculateFolderSize(file, subnode);
            nodeMap.put(subnode, subSize);
            size += subSize;
        } else {
            size += file.length();
        }
    }
    List<Entry<DefaultMutableTreeNode, Long>> nodes = new ArrayList<>(nodeMap.entrySet());
    Collections.sort(nodes, (o1,o2)-> o2.getValue().compareTo(o1.getValue()));
    for (Map.Entry<DefaultMutableTreeNode, Long> entry : nodes) {
        node.add(entry.getKey());
    }
    node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
    return size;
}

运行一下,看看效果:

结尾

自从ChatGPT等AI技术风靡全球以来,有不少人开始担忧:我会不会被AI所替代?虽然AI在许多领域展现出了惊人的能力,但要想完全替代人类仍需克服许多难题。

在本文中,即便是在AI目前已经显示出较高的技术水平下,它仍然需要我的改进和优化来完成我所提供的任务。AI可以被看作是一种工具,协助我解决一些复杂的问题,提高工作效率。

因此,替代你的并不是AI,而是那些能够运用AI的人。

附:最终完整代码

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class FolderSizeCalculator extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JButton btnSelectFolder;
    private JTree tree;
    private DefaultTreeModel treeModel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            try {
                FolderSizeCalculator frame = new FolderSizeCalculator();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * Create the frame.
     */
    public FolderSizeCalculator() {
        setTitle("Folder Size Calculator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        btnSelectFolder = new JButton("Select Folder");
        btnSelectFolder.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int result = fileChooser.showOpenDialog(FolderSizeCalculator.this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File folder = fileChooser.getSelectedFile();
                    DefaultMutableTreeNode root = new DefaultMutableTreeNode(folder.getName());
                    treeModel = new DefaultTreeModel(root);
                    tree.setModel(treeModel);
                    calculateFolderSize(folder, root);
                    tree.expandRow(0);
                }
            }
        });
        contentPane.add(btnSelectFolder, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        tree = new JTree();
        scrollPane.setViewportView(tree);
    }

    private long calculateFolderSize(File folder, DefaultMutableTreeNode node) {
        long size = 0;
        Map<DefaultMutableTreeNode, Long> nodeMap = new HashMap<>();
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(file.getName());
                long subSize = calculateFolderSize(file, subnode);
                nodeMap.put(subnode, subSize);
                size += subSize;
            } else {
                size += file.length();
            }
        }
        List<Entry<DefaultMutableTreeNode, Long>> nodes = new ArrayList<>(nodeMap.entrySet());
        nodes.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        for (Map.Entry<DefaultMutableTreeNode, Long> entry : nodes) {
            node.add(entry.getKey());
        }
        node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
        return size;
    }

    private String humanReadableByteCount(long bytes, boolean si) {
        int unit = si ? 1000 : 1024;
        if (bytes < unit) {
            return bytes + " B";
        }
        int exp = (int) (Math.log(bytes) / Math.log(unit));
        String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
        return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AttributeError: ‘ChatGLMConfig‘ object has no attribute ‘quantization_bit‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

STM32 产生随机数方式

STM32 产生随机数方式 C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数&#xff0c;可以配合产生伪随机数。其中srand(seed)产生算法种子&#xff0c;再由rand()通过算法产生随机数&#xff0c;产生的随机数在宏定义RAND_MAX范围内。如果seed不变&#xff0c;则产…

测试从未如此简单:接口自动化测试Python脚本实现

目录 摘要 步骤1&#xff1a;安装依赖项 步骤2&#xff1a;编写测试脚本 步骤3&#xff1a;运行测试 结论 摘要 自动化测试是现代软件开发过程中的重要环节。在许多情况下&#xff0c;特别是在web应用程序和移动应用程序中&#xff0c;接口自动化测试是其基础。下面就来介绍一…

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…

详解树与二叉树的概念,结构,及实现(上篇)

目录 一&#xff0c; 树 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二&#xff0c; 二叉树 2.1二叉树概念 三&#xff0c;特殊的二叉树 1. 满二叉树 2. 完全二叉树 3. 1 二叉树的性质 3. 2 二叉树的存储…

北邮22信通:二叉树层序遍历的两种方法首发模板类交互

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.用队列存储 2.1用模板类实现队列 2.1.1核心思路&#xff1a; …

FL Studio电音编曲软件V21中文完整版 安装下载教程

目前水果软件最版本是FL Studio 21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;…

PTA L2-045 堆宝塔 (25 分)

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…

掌握ChatGPT:全面指南和GPT-3.5与GPT-Plus的对比分析

在人工智能领域&#xff0c;最近的一大重磅炸弹是OpenAI发布了GPT-4架构下的ChatGPT。这款先进的自然语言处理模型已经引起了很多关注&#xff0c;让我们来深入了解怎么使用这个强大的工具&#xff0c;以及比较GPT-3.5与GPT-Plus的差异。 什么是ChatGPT&#xff1f; ChatGPT是…

JavaScript经典教程(三)-- JavaScript -- 基础数据类型详解

183&#xff1a;基础数据类型详解 1、复习 1、全局变量&#xff1a; 依托于window环境下的的变量。 在window大环境下&#xff08;即最外层&#xff09;申明的变量a&#xff0c;即为全局变量。 2、window&#xff1a; window下的变量为全局变量。 window可省略。 3、作用域…

021 - C++ 构造函数

我们继续学习 C 的面向对象编程&#xff0c;本期主要是讲其中的 构造函数。 什么是构造函数呢&#xff1f; 构造函数基本上是一种特殊类型的方法&#xff0c;它在每次实例化对象时运行。 我们直接来看一个例子吧。 例子时间 我们将要通过创建一个 Entity 类来深入了解这个…

vscode python3.6配置pcl点云库 obj3d模型转pcd点云图

配置vscode python3.6的环境我就跳过了,网上都有 1.下载PCL1.9 github:pcl-1.9.1 百度云:PCL-1.9.1-AllInOne-msvc2017-win64提取码adcx 2.安装硬盘任意位置,我是E盘,在安装过程中会弹出openni的安装提示,将它安装路径选择在E:\PCL 1.9.1\3rdParty\OpenNI2,等待安装完成 3.…

.netCHATING 10.4 for NET6-7.0-Crack

.NET 6.0图表支持--dotnetcharting .netCHATING 10.4添加了.NET 6.0图表nuget包和.NET 6.0图表示例包&#xff08;需要Visual Studio 2022&#xff09;&#xff0c;.NET 5是.NET Core 3.1和.NET Framework 4.8的继任者&#xff0c;旨在为.NET开发人员提供新的跨平台开发体验。…

Mysql列的类型定义(字符串类型)

文章目录 一、CHAR 类型和 VARCHAR 类型 1.字符串字符(M)2.实战类型二、TEXT 类型 1.类型表2.特别注意3.实战建议4.实战练习三、ENUM 和 SET 类型 1.ENUM类型2.SET类型总结 一、CHAR 类型和 VARCHAR 类型 CHAR类型和VARCHAR类型都在创建表时指定了最大长度&#xff0c;其基本形…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

拿下多家车企定点!4D毫米波雷达「域」系统首发出道

从1R、2R、3R到整车360感知方案&#xff0c;毫米波雷达的前装市场需求量依然保持着快速增长的态势。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;前装标配搭载ADAS毫米波雷达&#xff08;前向后向盲区&#xff09;交付1795.…

mov是什么格式的视频,mov怎么转mp4

mov是什么格式的视频&#xff0c;MOV即QuickTime影片格式&#xff0c;它是Apple公司开发的一种音频、视频文件格式&#xff0c;用于存储常用数字媒体类型。MOV部分编码在没有quicktime的电脑中不能播放&#xff0c;不能后期剪辑制作MP4的通用率高于MOV格式支持MP4格式的播放器绝…

获得将要生成的资源的GUID

1&#xff09;获得将要生成的资源的GUID ​2&#xff09;多个小资源包合并为大资源包的疑问 3&#xff09;模型Meta中的hasExtraRoot参数的作用和历史原因 4&#xff09;合批注意点 这是第333篇UWA技术知识分享的推送&#xff0c;也是《厚积薄发 | 技术分享》第三回&#xff0c…

PMP-上班摸鱼整理的知识点

1、主要解决流程:问题-风险-变更: 先分析是问题还是风险&#xff0c;解决问题、可以减少新的风险&#xff0c;登记风险&#xff0c;可以随时应对问题,2、变更管理流程 变更原则: 需提正式变更申请&#xff0c;先分析评估后变更&#xff0c;不改变基准项目经理审批&#xff0c;改…