提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、需要的环境和包
- 二、编写步骤
- 1.excle文件操作类
- 2.排序算法
- 3.主函数
- 三、执行结果
- 1.原始文件与初始化后的情况
- 2.程序运行界面(后文对每个模块的执行做了省略)
- 四、结尾
前言
提示:这里可以添加本文要记录的大概内容:
本文是在进行数据结构学习中的一个不成熟的尝试项目,在面向对象的开发中还是使用了一些位于main函数里的面向过程开发。基本技术还是不难的,仅供各位参考。
提示:以下是本篇文章正文内容,下面案例可供参考
一、需要的环境和包
需要环境:java语言已经OK,笔者采用的是idea开发环境
需要包:jxl包(用于excle文件执行) //本文最后有jxl包附件下载地址
二、编写步骤
1.excle文件操作类
在本文中由于为简单的职工管理系统,所以说没有采用数据库进行编写,而是采用了文件的读写来将数据导入内存中。在进行选择txt文件和与数据库有些许类似的excle文件时笔者还是采用了excle文件,由于其行列分明还是比较好读的。
代码如下:
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class excleFiles {
//private static String[][] workers = new String[100][8];
//private static String[] workerName = new String[100];
public void go(String[][] workers,String[] workerName) {//对内存表格进行初步处理已完善!
File f = new File("data.xls");
try {
Workbook book=Workbook.getWorkbook(f);//
Sheet sheet=book.getSheet(0); //获得第一个工作表对象
for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){
Cell cell=sheet.getCell(j, i); //获得单元格
//System.out.print(cell.getContents()+" ");
workers[j][i] = cell.getContents();
}
Cell cell2 = sheet.getCell(0,i);
workerName[i] = cell2.getContents();
//System.out.print("\n");
}
//System.out.println(sheet.getColumns());
//System.out.println(sheet.getRows());
/*for(int i=0;i<sheet.getRows();i++){
for(int j=0;j<sheet.getColumns();j++){
//Cell cell=sheet.getCell(j, i); //获得单元格
System.out.print(workers[j][i]+" ");
}
//System.out.print("\n");
}*/
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public int getTotal(){//读出现在表中存在多少个职工信息已完善!
File f = new File("data.xls");
int total = 0;
try {
Workbook book = Workbook.getWorkbook(f);//
Sheet sheet = book.getSheet(0); //获得第一个工作表对象
total = sheet.getRows();
}catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return total;
}
public void output(String[][] workers){//写入data.xls表
}
/*private void show() {//验证一下导入成功没有
for (int i = 0; workers[i][0] != null; i++) {
for (int j = 0; j < 7; j++) {
System.out.println(workers[i][j]);
}
}
}*/
/*public static void main(String args[]){
for (int i = 0; workers[i][0] != null; i++) {
for (int j = 0; j < 7; j++) {
System.out.println(workers[i][j]);
}
}
}*/
}
在此段代码中笔者由于当时对于java用的还不是很熟练,所以还是有很多对于试错的处理。因为毕竟也是自己探寻过的证明所以也就没有删除。初始化函数采用从主函数中导入空二维数据works[][]来进行处理并回传。
并且导入之后有一点需要注意的是二维数组中的数据并不是按照在excle中输入的行列进行存储的。二维数组中的列是excle中的行,二维数组上的行
在本系统中还有一个缺陷是在最后并没有进行数据的写回。但是这部分也并不困难,需要的兄弟们可以自己去找一找。
2.排序算法
在本系统中还是希望实现无论原始表为多乱,在导入表之后的初始情况能够按照姓名进行字典排序。同时由于根据选定属性进行升序排序的要求,字典排序由于其泛用性(各种属性都包含)而有更多的作用。写成单独的类在很多模块中都可以用到。
具体代码如下:
import java.io.UnsupportedEncodingException;
public class sortUp {
public void sort(String[][] workers,int total,int sign){
//外层循环控制比较的次数
for (int i = 0; i < total-1; i++) {
//内层循环控制到达位置
for (int j = 0; j < total - i - 1; j++) {
//前面的元素比后面大就交换
if (compare(workers,sign,j)) {
int i1;
String temp = null;
for (i1 = 0;i1 < 8;i1++) {
temp = workers[i1][j];
workers[i1][j] = workers[i1][j + 1];
workers[i1][j + 1] = temp;
}
}
}
}
}
public static boolean compare(String[][] workers,int sign,int i){
try {
String str1 = new String(workers[sign][i].toString().getBytes("GB2312"),"ISO-8859-1");
String str2 = new String(workers[sign][i+1].toString().getBytes("GB2312"),"ISO-8859-1");
if (str1.compareTo(str2) < 0){
return false;
}
else {
return true;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("有异常出现");
return false;
}
}
在上述代码中,采用了冒泡排序对无序的“一维数组”(因为规定了以第几行的值为比对参数)进行升序排列。在compare函数中利用了字典排序的方法。其根本方式是将字符串全部转化为ISO-8859-1编码进行比较。
3.主函数
主函数包含了简易的控制台人机交互界面(没有编写相应的图形操作界面,有一说一java图形界面真的烦\生气)以及具体的实现,其实这个也可以编写到其他类里,主函数只包含对象。
具体代码如下:
import java.util.*;
public class main {
private static Scanner input = new Scanner(System.in);
private static String[][] workers = new String[100][8];
private static String[] workerName = new String[100];
private static String[] newWorker = new String[8];
private static int total = 0;
public static void main(String[] args) {
excleFiles file = new excleFiles();
file.go(workers,workerName);//初始化workers表
sortUp Osort = new sortUp();
total = file.getTotal();
Osort.sort(workers,total,0);
System.out.println("经过姓名字典排序后的职工表为");
for (int i = 0;i < total;i++){
for (int j = 0;j < 8;j++){
System.out.print(workers[j][i]+" ");
}
System.out.println();
}//此部分为调试代码时验证使用
System.out.println("********************欢迎使用职工管理系统*********************");
System.out.println("* *");
System.out.println("* 1.增加职工 *");
System.out.println("* 2.删除职工 *");
System.out.println("* 3.查询职工信息 *");
System.out.println("* 4.修改职工信息 *");
System.out.println("* 5.根据需要对职工进行排序 *");
System.out.println("* 6.退出 *");
System.out.println("* *");
System.out.println("***********************职工管理系统**********************");
while (true) {
System.out.println("请选择需要的服务(1-6):");
int Select = input.nextInt();
if(Select == 1){//添加功能已完善!
int i = 0;
System.out.println("您现在选择的是增加职工,请输入对应信息");
System.out.println("姓名:");
newWorker[i] = input.next();
i++;
System.out.println("性别:");
newWorker[i] = input.next();
i++;
System.out.println("出生年月:");
newWorker[i] = input.next();
i++;
System.out.println("工作年月:");
newWorker[i] = input.next();
i++;
System.out.println("学历:");
newWorker[i] = input.next();
i++;
System.out.println("职务:");
newWorker[i] = input.next();
i++;
System.out.println("住址:");
newWorker[i] = input.next();
i++;
System.out.println("电话:");
newWorker[i] = input.next();
System.out.println("您输入的用户信息为");
for (i = 0;i < 8;i++) {
System.out.print(newWorker[i] + " ");
}
System.out.println("是否对其进行写入?确认请输入y,否则输入n");
if(input.next().equals("y")){
for (i = 0;i < 8;i++) {
workers[i][total] = newWorker[i];
}
total++;
System.out.println("已写入");
}
System.out.println("现在职工表信息为");
for (i = 0;i < total;i++){
for (int j = 0;j < 8;j++){
System.out.print(workers[j][i]+" ");
}
System.out.println();
}//此部分为调试代码时验证使用
}
if(Select == 2){//删除功能(已写完但是未完善)//已完善!!!一遍过
int flag = 0;
System.out.println("您现在使用的是删除功能,请输入您要删除的员工姓名");
String selectName = input.next();
for(int i = 0;i < total;i++){
if (workers[0][i].equals(selectName)) {
System.out.println("匹配成功");
flag = 1;
for (int h = 0;h < 8;h++) {
System.out.print(workers[h][i] + " ");
}
System.out.println("您是否决定对其进行删除?删除请输入y,否则输入n");
if (input.next().equals("y")){
for (;i < total;i++){
for (int j=0;j < 8;j++){
workers[j][i] = workers[j][i+1];
}
}
total--;
}
break;
}
}
if (flag == 0){
System.out.println("在职工表中未找到匹配对象");
}
System.out.println("现在职工表信息为");
for (int i = 0;i < total;i++){
for (int j = 0;j < 8;j++){
System.out.print(workers[j][i]+" ");
}
System.out.println();
}//此部分为调试代码时验证使用
}
if (Select == 3){//查询功能已完善!
int flag = 0;
System.out.println("您现在使用的是查询功能,请输入您查询的员工姓名");
//System.out.println(total);(total值已经成功导入)
/*for (int i=0;i < total;i++){
for (int j=0;j < 7;j++){
System.out.println(workers[j][i]);
}
}*///workers表已经成功导入
String selectName = input.next();
//if (selectName.equals("a"))
//System.out.println("和a一样");
//System.out.println(selectName);
for (int i = 0;i < total;i++){
//System.out.println(workers[0][i]);这个匹配是对的
if (workers[0][i].equals(selectName)){
System.out.println("匹配成功");
for (int j=0;j < 8;j++) {
System.out.print(workers[j][i] + " ");
}
flag = 1;
break;
}
}
if (flag == 0){
System.out.println("未在职工表中找到匹配对象!");
}
}
if (Select == 4){//修改值(已写但是未完善)//就改了一个值,总体功能没问题,gooddd~
int flag = 0;
System.out.println("您现在使用的是检索并修改功能,请输入您检索的员工姓名");
String selectName = input.next();
for (int i = 0;i < total;i++){
if (workers[0][i].equals(selectName)){
System.out.println("匹配成功,请输入您想修改的属性编码,编码对应如下");
flag = 1;
System.out.println("姓名:0 性别:1 出生年月:2 工作年月:3 学历:4 职务:5 住址:6 电话:7");
//String temp = input.next();
int temp = input.nextInt();
for (int j = 0;j < 8;j++){
//System.out.println(temp);测试用的
if (temp == j){
System.out.println("请输入您修改后的值");
workers[j][i] = input.next();
System.out.println("已修改完毕!");
}
/*else{
System.out.println("还没匹配到");
}*/
}
break;
}
}
if (flag == 0){
System.out.println("未在职工表中找到匹配对象!");
}
System.out.println("此时职工表为");
for (int i=0;i < total;i++){
for (int j = 0;j < 8;j++){
System.out.print(workers[j][i]+" ");
}
System.out.println();
}
}
if (Select == 5){//排序输出(采用的是升序字典排列法)
System.out.println("您选择的是排序功能,本系统将对职工表中的选定属性行升序排列");
int sign;
sortUp sort1 = new sortUp();
System.out.println("请选择您想要进行排序的属性编码,编码对应如下");
System.out.println("姓名:0 性别:1 出生年月:2 工作年月:3 学历:4 职务:5 住址:6 电话:7");
sign = input.nextInt();
sort1.sort(workers,total,sign);
System.out.println("此时职工表为");
for (int i=0;i < total;i++){
for (int j = 0;j < 8;j++){
System.out.print(workers[j][i]+" ");
}
System.out.println();
}
}
if (Select == 6){//退出并写入文件
file.output(workers);
System.out.println("感谢您的使用,欢迎下次再来!");
break;
}
}
}
}
这一部分笔者还是延续了之前的习惯,没有对自己的思考和试错代码进行去掉,只是注释掉了。这一部分其实人不人鬼不鬼(有面向对象的存在,但是有有点面向过程了,真的不太行),以后应该有时间的时候还会有优化版的推出。
三、执行结果
1.原始文件与初始化后的情况
2.程序运行界面(后文对每个模块的执行做了省略)
四、结尾
这个程序还是存在有很多的改进的空间。放出本程序也是我的第一篇博文,从构思到完成一共花费了大约4天的时间。
在进行项目编写的过程中,我觉得最重要的点事提炼程序的“中心点”。什么是“中心点”,就是这个程序的重点在哪里。比如这个程序,其重点就在于文件读写处理,数组初始化和字典排序上。在编码的过程中只要把这三个点抓透彻了,那么剩下的编程就是小case了。比如在写云盘系统时(javaEE),重点就是把握好文件的上传以及下载,并且与数据库做好沟通,写出一个页面的漂亮表格,每一个点都很容易实现,在编程中无非就是把这几个要点一遍遍使用。
同时,还应该时刻注意对于代码模块的测试。尽量在自己“举棋不定”(不能确定一定对)的情况下先做点小小的测试。错误的堆砌是指数级的(至少我是怎么感觉的),本来几个简单的错误(比如==打成=,少打一个‘)’),就会演变成很严重的错误,找几百年都找不出这种。
对于本系统的不足欢迎交流指正!