学习Java的感受
因为是计算机专业的学生,开始计划着自学Java,从买书、看视频、到自己完成一些小项目,总感觉却了些什么,对Java这门语言还是感觉比较陌生,也可以说理解的还不够透彻吧。一次校企合作的培训参观,上了一天的培训课后,终于意识到了自己所缺少的东西:对Java这门语言没有系统的了解,只是停留在表面的会用,但不理解这么做的理由。这次的参观学习,让我重新找到了方向,参加一个培训也不是必不可少的,但是却是见效最快的,毕竟大部分人都会存在惰性,若不是现实处境所迫,也没有人会去强迫自己,谁不想着玩呢。当然正是这种强迫,将会成为学习的一种动力。自学总会遇到一些或多或少的问题,百度的途径不一定可以解决所有的问题,而线下的培训,就很好的解决了这个问题。我们更多的是去学习这种解决办法的方法,毕竟以后进入企业,就没有老师来专门给你解决问题了,还是得靠自己。学习java最重要的工具——API文档,随着jdk版本的迭代,API文档也逐渐完善,大部分内容是比较准确的,学会查文档,也是学习java的基础。课上的学习,加上必要的练习,以及坚持课后经常的复习,相信在牢固的基础之后,学更复杂的内容和框架,就不会太困难了。经过一个星期的学习,学到了很多常用类的用法,也在老师打的带领下写了几个有趣的小程序,在这里分享一下。
小程序一:目录遍历
要求对一个指定的目录进行遍历,获取该目录下所有的文件,并且,考虑该目录下还存在子目录?要求以文件树的形式输出目录结构:
具体实现代码:
import java.io.File;
public class ReadFile {
/**
* 获取目录和文件名
* @param file
* @param level
*/
public void getFileName(File file,int level) {
//获取该目录的文件(目录)列表
File[] files = file.listFiles();
level++;
if(files != null) {
for(File f:files) {
//根据level分层打印--
for (int i = 0; i < level; i++) {
System.out.print("--");
}
System.out.println(f.getName());
//判断该对象是否是目录,是目录则递归
if(f.isDirectory()) {
getFileName(f, level);
}
}
}
}
public static void main(String[] args) {
new ReadFile().getFileName(new File("D:\\新建文件夹\\java\\test"),0);
}
}
小程序二:微信红包生成算法实现
要求实现是一个微信红包生成的算法,通过提供一个总金额,以及红包数,要求根据红包总数随机生成金额不等的红包,并输出;要求输出的每个红包金额总和要等于总金额,要求最低金额不能少于0.01元。
具体实现代码:
/**
* 红包类
* @author 半夏微凉
*
*/
public class RedPacket {
/**总金额*/
private String sumMoney;
/**红包总数*/
private int count;
public RedPacket(String sumMoney,int count) {
this.sumMoney = sumMoney;
this.count = count;
}
public String getSumMoney() {
return sumMoney;
}
public void setSumMoney(String sumMoney) {
this.sumMoney = sumMoney;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
/**
* 自定义红包异常
* @author 半夏微凉
*
*/
public class RedPacketException extends Exception{
public RedPacketException() {
}
public RedPacketException(String message) {
super(message);
}
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Random;
public class RedPacketManager {
private Random r = new Random();
public ArrayList<BigDecimal> genPacket(RedPacket rp) throws RedPacketException{
//定义BigDecimal类型集合存储每个人所获得的红包金额
ArrayList<BigDecimal> list = new ArrayList<>();
//将保底的0.01元包装成BigDecimal类型
BigDecimal money = new BigDecimal("0.01");
//用于存储前n-1个人所分红包的总金额
BigDecimal sends = new BigDecimal("0");
//获取总金额的最小值
double minMoney = money.multiply(new BigDecimal(rp.getCount())).doubleValue();
//将字符串类型总金额包装成BigDecimal
BigDecimal totalMoney = new BigDecimal(rp.getSumMoney());
//判断红包的最小值是否超过了总金额(总金额不够分)
if(minMoney > totalMoney.doubleValue()) {
throw new RedPacketException("每个红包不能少于0.01元");
}
if(minMoney == totalMoney.doubleValue()) {
//最低金额正好等于总金额
for (int i = 0; i < rp.getCount(); i++) {
list.add(new BigDecimal("0.01"));
}
return list;
}
//总金额超过每个人最低金额
//获取分配的随机比例
double[] scales = randomSale(rp.getCount());
//给n-1个人分红包
for (int i = 0; i < scales.length - 1; i++) {
//根据比例计算每个红包分得的金额
money = totalMoney.multiply(new BigDecimal(scales[i])).setScale(2,BigDecimal.ROUND_HALF_EVEN);
//累计已经分配的金额
sends = sends.add(money);
//将每个人所分的金额加入到集合中
list.add(money);
}
list.add(totalMoney.subtract(sends));
return list;
}
/**
* 随机生成比例
* @param n
* @return
*/
public double[] randomSale(int n) {
//累计总的随机值
double total = 0;
//临时数组存储每个红包的随机比例
double[] scales = new double[n];
for (int i = 0; i < scales.length; i++) {
//随机获得一个1~100的整数
int rint = r.nextInt(100)+1;
//将每个随机数分别存入数组
scales[i] = rint;
//计算总的随机值
total += rint;
}
//计算比例
for (int i = 0; i < scales.length; i++) {
scales[i] = scales[i] / total;
}
return scales;
}
public static void main(String[] args) throws RedPacketException {
ArrayList<BigDecimal> list = new RedPacketManager().genPacket(new RedPacket("10", 5));
for(BigDecimal bd:list) {
System.out.println(NumberFormat.getCurrencyInstance().format(bd)+"\t");
}
}
当然基本功能实现了,但也存在一些不足:例如,红包数较少时,有可能出现¥0.00的红包。
总结
在学习了一些基础知识后,就可以动手做一些有趣的小程序了,这些小程序不仅可以提升我们学习的乐趣,还能加强我们所学的知识,我觉得很有必要。相信随着不断的学习,我也可以学到更多的知识,最终走上求职之路。