目录
前言
一、Java
二、数据结构
参考来源
前言
自从听完讲座的那一天,一直在思考如何去记录学习周记来提升自己,如何让周记对自己而言更加高效。目前阶段来说,学的东西比较杂,啥都沾点,所以打算是以周记的形式将一周学习到的各个方面的知识记录下来,看看这个方式是否有效吧,正如黄闻欣先生所说,光坚持就很困难了。
况且来说,我不太喜欢正儿八经整理出来一份详细的学习笔记,比较想拿来记周记,有必要的话以后自己再重新整理一下吧。
废话比较多,以后自己看到忽略就好了。
一、Java
Java的大作业真是让人抓耳挠腮,不是说有多折磨,只是临近DDL了才开始写,感觉大作业的分要歇逼了啊。
可恶的艾斯医药系统。
1. 文件选取器——JFileChooser
首先思考的是如何实现文件导航界面呢,啊该不会是要自己手写吧。显然不是,Swing里面有这个JFileChooser类,就是用来实现这个窗体的。
常用方法:
//无参构造
JFileChooser();
//有参构造
JFileChooser(currentDirectory);
//该方法主要用于设置打开导航框时显示的文件。
void setCurrentDirectory(File file);
/*
该方法用于设置文件的打开模式,一般有以下三种文件打开模式:
JFileChooser.FILES_ONLY: 只能选文件;
JFileChooser.DIRECTORIES_ONLY: 只能选文件夹;
JFileChooser.FILES_AND_DIRECTORIES: 文件和文件夹都可以选。
*/
void setFileSelectionMode(int mode);
//该方法用于设置是否可以同时选取多个文件,默认值是false。
void setMultiSelectionEnabled(boolean b);
//该方法是用于设置文件过滤选择器,也就是允许你选择的文件类型。
void addChoosableFileFilter(FileFilter filter);
//该方法用于设置默认的文件过滤器。
void setFileFilter(FileFilter filter);
//两者均用于设置被选中的文件,单个或多组文件。
void setSelectedFile(File file);
void setSelectedFiles(File[] selectedFiles);
//该方法用于显示我们选择文件时弹出的框,亦即文件导航窗。
int showOpenDialog(Component parent);
/**
顾名思义该方法是保存文件的弹出框。
此处两个parent表示的意思是:文件选取器对话框的父组件, 对话框将会尽量显示在靠近 parent 的中心; 如果为 null, 则显示在屏幕中心。
同时呢这两个方法的返回值也代表着特定的意思:
JFileChooser.CANCEL_OPTION: 点击了取消或关闭 ;
JFileChooser.APPROVE_OPTION: 点击了确认或保存 ;
JFileChooser.ERROR_OPTION: 出现错误。
常常用于判断文件是否要打开或者保存。
*/
int showSaveDialog(Component parent);
//该方法用于获取打开或保存的文件。
File getSelectedFile();
File[] getSelectedFiles();
在项目中的代码案例:
/**
* 打开文件方法.
*/
public void openFile(){
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("TXT & DOC & PDF files","txt","doc","pdf");
chooser.setFileFilter(filter);
int returnVal=chooser.showOpenDialog(chooser);
if(returnVal==JFileChooser.APPROVE_OPTION){
System.out.println("打开文件:"+ returnVal);
}
}
2.Java操作桌面默认应用——Desktop类
起因是有个访问官网的功能需要实现,说实在我确实不太清楚Java要如何实现URI跳转。
搜索了一下,发现是可以通过Desktop类来对桌面应用进行操作,通过打开浏览器来进行URI读取。Desktop 类允许 Java 应用程序启动已在本机桌面上注册的关联应用程序,以处理 URI 或文件。
支持的操作包括:
- 打开浏览器: 启动用户默认浏览器来显示指定的 URI;
- 打开邮件客户端: 启动带有可选 mailto URI 的用户默认邮件客户端;
- 打开文件/文件夹: 启动已注册的应用程序,以打开、编辑 或 打印 指定的文件。
常用方法:
// 判断当前平台是否支持此类
static boolean isDesktopSupported()
// 获取与当前平台关联的 Desktop 实例
static Desktop getDesktop()
// 启动默认浏览器来显示 URI
void browse(URI uri)
// 启动关联应用程序来打开文件
void open(File file)
// 启动关联编辑器应用程序并打开用于编辑的文件
void edit(File file)
// 使用关联应用程序的打印命令, 用本机桌面打印设备来打印文件
void print(File file)
// 启动用户默认邮件客户端的邮件组合窗口
void mail()
// 启动用户默认邮件客户端的邮件组合窗口, 填充由 mailto:URI 指定的消息字段
void mail(URI mailtoURI)
/*
* 判断当前平台是否支持某一操作, 参数为以下值之一:
* Desktop.Action.OPEN: 打开动作
* Desktop.Action.EDIT: 编辑动作
* Desktop.Action.PRINT: 打印动作
* Desktop.Action.MAIL: 邮件动作
* Desktop.Action.BROWSE: 浏览器动作
*/
boolean isSupported(Desktop.Action action)
在项目中的代码案例:
/**
* 处理"访问官网"选择监听器的内部类
*/
class WebListener implements ActionListener {
public void actionPerformed(ActionEvent event){
Desktop desktop =Desktop.getDesktop();
try{
desktop.browse(new URI("https://www.sztu.edu.cn/"));
}catch (Exception e) {
e.printStackTrace();
}
}
}
3.Java箱式布局——BoxLayout
做ui的时候发现,源码使用的Borderlayout很难实现垂直排布,所以思考如何换个布局。
在Swing里面有一个箱式布局BoxLayout可以实现水平或垂直排布,总体使用上也比Flowlayout要灵活很多。
Swing 提供了一个实现了 BoxLayout 的容器组件Box。使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件。用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂。
创建水平/垂直箱容器(Box):
// 创建一个水平箱容器
Box hBox = Box.createHorizontalBox();
// 创建一个垂直箱容器
Box vBox = Box.createVerticalBox();
Box 内的组件之间默认没有空隙并居中,如果想在组件之间(或头部/尾部)添加空隙,可以在其中添加一个影响布局的不可见组件。Box 提供了三种用于填充空隙的不可见组件:glue、struts 和 rigidAreas。
创建 胶状(宽/高可伸缩)的不可见组件(glue):
// 创建一个 水平方向胶状 的不可见组件,用于撑满水平方向剩余的空间(如果有多个该组件,则平分剩余空间)
Component hGlue = Box.createHorizontalGlue();
// 创建一个 垂直方向胶状 的不可见组件,用于撑满垂直方向剩余的空间(如果有多个该组件,则平分剩余空间)
Component vGlue = Box.createVerticalGlue();
// 创建一个 水平和垂直方向胶状 的不可见组件,用于撑满水平和垂直方向剩余的空间(如果有多个该组件,则平分剩余空间)
Component glue = Box.createGlue();
创建 固定宽度或高度 的不可见组件(struts):
// 创建一个 固定宽度 的不可见组件(用于水平箱)
Component hStrut = Box.createHorizontalStrut(int width);
// 创建一个 固定高度 的不可见组件(用于垂直箱)
Component vStrut = Box.createVerticalStrut(int height);
创建 固定宽高 的不可见组件(rigidAreas):
// 创建 固定宽高 的不可见组件
Component rigidArea = Box.createRigidArea(new Dimension(int width, int height));
在项目中的代码案例:
detailsButton = new JButton("详细...");
clearButton = new JButton("清空");
exitButton = new JButton("退出");
shoppingButton = new JButton("查看购物车");
bottomPanel = new JPanel();
this.setLayout(new BorderLayout());
JPanel rightPanelBox=new JPanel();
rightPanelBox.setLayout(new BoxLayout(rightPanelBox,BoxLayout.Y_AXIS));
rightPanelBox.add(shoppingButton);
rightPanelBox.add(Box.createVerticalStrut(10));
rightPanelBox.add(detailsButton);
rightPanelBox.add(Box.createVerticalStrut(10));
rightPanelBox.add(clearButton);
rightPanelBox.add(Box.createVerticalGlue());
rightPanelBox.add(exitButton);
this.add(BorderLayout.EAST, rightPanelBox);
二、数据结构
1. 堆排序
堆排序虽然看上去是完全二叉树的结构,但是其实并不是通过建树来实现,而是利用数组。实现过程其实并不困难,主要就是一个筛选算法,不过在循环次数上需要注意。
筛选算法:
void Heapadjust(int *num,int low,int n){
num[0]=num[low];
for(int i=2*low;i<=n;i*=2){
if(i+1<=n&&num[i]>num[i+1])
i++;
if(num[0]<=num[i])break;
swap(num[low],num[i]);
low=i;
}
}
需要多加理解的是,堆排序是先通过不断的交换堆顶和子节点然后下筛来实现建堆,然后通过从n/2开始向下对比排序。之前理解的是反的。。。
具体可参考:https://www.cnblogs.com/jingmoxukong/p/4303826.html
2. KMP算法
OJ上写到了一题,发现其实又是KMP算法,刚好重温一下,前阵子学过的又忘记了。
- 输入主串和模式串,寻找模式串的next[]数组(第j位时,j前面的子串的前缀集与后缀集中最大重复子串长度),其中,next [0] = -1。
- KMP移动比较,若比较中不符合,则模式串指针j回溯到next[j]的位置。
- 若匹配成功,返回子串的位置。
getnext数组代码:
void Getnext(int next[],String t)
{
int j=0,k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k == -1 || t[j] == t[k])
{
j++;k++;
next[j] = k;
}
else k = next[k];
}
}
这个getnext的算法是个小难点,记录一下。
原理可参考:https://blog.csdn.net/dark_cy/article/details/88698736
参考来源:
https://blog.csdn.net/weixin_42294984/article/details/82707409