Longstick的学习周记——第一周

 

目录

前言

一、Java

1. 文件选取器——JFileChooser

2.Java操作桌面默认应用——Desktop类

3.Java箱式布局——BoxLayout

二、数据结构

1. 堆排序

2. KMP算法

参考来源

 


前言

自从听完讲座的那一天,一直在思考如何去记录学习周记来提升自己,如何让周记对自己而言更加高效。目前阶段来说,学的东西比较杂,啥都沾点,所以打算是以周记的形式将一周学习到的各个方面的知识记录下来,看看这个方式是否有效吧,正如黄闻欣先生所说,光坚持就很困难了。

况且来说,我不太喜欢正儿八经整理出来一份详细的学习笔记,比较想拿来记周记,有必要的话以后自己再重新整理一下吧。

废话比较多,以后自己看到忽略就好了。


一、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算法,刚好重温一下,前阵子学过的又忘记了。

  1. 输入主串和模式串,寻找模式串的next[]数组(第j位时,j前面的子串的前缀集与后缀集中最大重复子串长度),其中,next [0] = -1
  2. KMP移动比较,若比较中不符合,则模式串指针j回溯到next[j]的位置。
  3. 若匹配成功,返回子串的位置。

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

https://blog.csdn.net/xietansheng/article/details/78453718

https://blog.csdn.net/xietansheng/article/details/72814557

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值