Java第02次实验(Java基本语法与类库)
1.PTA
1.1 综合小测验
主要代码
要点、注意事项
- Eclipse自动生成快捷键解Alt+,如switch、for、while、sysout、main。
- 使用Eclipse快速创建程序框架(利用Eclipse的quick fix功能快速创建方法)。
- 不要重复创建Scanner对象。
- 缩进, Tab、Shift+Tab。运行, ctrl+F11。
- 如果JDK为1.6版本(最新版PTA已支持1.8),switch不支持字符串。需先将字将String转化为int(早期的PTA 中使用的open jdk6)
- 使用Eclipse的quick fix功能快速创建函数
int choice2Int(String choice)
Q&A
Q:处理输入时遇到什么问题?如何解决?
A:处理输入时如果将nextLine()与其它next方法混用,出现行尾回车换行未处理影响下次输入的情况,在处理输入的时候,尽量只使用Scanner的nextLine()方法接收输入,不要将nextLine()与其它next方法混用
Q:处理输入选项时采用了什么样的方式?为什么?
A:使用了 Switch 而非 if-else ,使代码较为清晰直观,便于理解,降低代码量
Q:sort方法和search方法都要用到同一个数组nums,是如何解决的?
A:将要共享的int数组定义为Main类的类属性
Q:使用nextLine()
输入得到的数据如何处理成数组?
A:String[] numStrs = line.split(" ")
表示用空格分隔数据,再利用for循环和Integer.parseInt(numStrs[i])
逐个将字符串类型转换为int类型存入int数组
Q:如何抽出年月日?
A:利用String.substring(index1,index2 )
提取子字符串
1.2 身份证排序
主要代码
要点、注意事项
- sort1可直接使用
Arrays.sort
,String的subString。 - 采用结构化编程方式,针对
sort1
、sort2
各写一个方法处理。 nextInt()
与nextLine()
混用可能出现行尾回车换行未处理影响下次输入的情况。建议:全部使用Scanner的nextLine()处理输入以免碰到行尾回车换行问题。
Q&A
Q:nextInt()
与nextLine()
混用可能产生的后果?
A:可能出现行尾回车换行未处理影响下次输入的情况。建议:全部使用Scanner的nextLine()
处理输入以免碰到行尾回车换行问题。
Q:如何对出生年月日进行排序?
A:String.substring
截取出生年月日字符串,存入数组中,再用Arrays.sort()
函数进行自动排序
Q:如何将所有身份证按照里面的年月日升序输出?
A:使用了两层for循环,String.substring
截取出生年月日字符串,判断是否与排序过的日期相同,若相同则输出,反之不输出
1.3 ArrayList入门
主要代码
Q:本题你使用了哪些关于ArraysList的方法?
A:
方法 | 描述 |
---|---|
add(int index, E element) | 将指定元素插入此列表中的指定位置 |
add(E e) | 将指定的元素追加到此列表的末尾。 |
clear() | 从此列表中删除所有元素。 |
contains(Object o) | 如果此列表包含指定的元素,则返回 true 。 |
get(int index) | 返回此列表中指定位置的元素。 |
indexOf(Object o) | 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。 |
isEmpty() | 如果此列表不包含任何元素,则返回 true 。 |
lastIndexOf(Object o) | 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。 |
remove(int index) | 删除此列表中指定位置的元素。 |
remove(Object o) | 从该列表中删除指定元素的第一个匹配项(如果存在)。 |
removeAll(Collection<?> c) | 从此列表中删除指定集合中包含的所有元素。 |
set(int index, E element) | 用指定的元素替换此列表中指定位置的元素。 |
size() | 返回此列表中的元素数。 |
Q:ArraysList和普通数组有什么区别? | |
A:没有固定大小的限制,可以动态修改 |
Q:你认为使用ArraysList有哪些优缺点?
A:优点:
- 根据下标遍历元素效率较高。
- 根据下标访问元素效率较高。
- 在数组的基础上封装了对元素操作的方法。
- 可以自动扩容。
缺点: - 插入和删除的效率比较低。
- 根据内容查找元素的效率较低。
1.4 浮点数的精确运算
主要代码
要点、注意事项
- 浮点数不精确,使用BigDecimal解决。
- BigDecimal对象的构造(以字符串的方式构造)
- 熟悉以面向对象的方式进行各种操作(加减乘除)。
- BigDecimal的不可变性
Q&A
Q:为什么直接使用double类型数据进行运算,无法得到精确值?
A:计算机是二进制的,浮点数没有办法是用二进制进行精确表示
Q: BigDecimal对象的构造(以字符串的方式构造)?
A:public BigDecimal(String val)
Q:BigDecimal加减乘除运算?
A:
public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法
Q:一般什么时候使用BigDecimal?
A:要求结果精确的时候,比如商业计算
Q:BigDecimal的不可变性如何体现?
A:BigDecimal都是不可变的的,在进行每一步运算时,都会产生一个新的对象
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
a.add(b);
System.out.println(a); //输出4.5. 加减乘除方法会返回一个新的BigDecimal对象,原来的a不变
}
Math类应用
2.1
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int num[]=getNum(n);
double percentage =getPer(num);
System.out.println(percentage*100+"%");
System.out.println((1-percentage)*100+"%");
sc.close();
}
private static int[] getNum(int n)
{
int num[]=new int[n];
for (int i = 0; i < n; i++)
{
num[i]=(int)(Math.random()*99)+1;
}
return num;
}
private static double getPer(int[] num)
{
int count=0;
for (int i = 0; i < num.length; i++)
{
if(num[i]>50)
{
count++;
}
}
double percentage = count*1.0/num.length;
return percentage;
}
}
2.4
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int length =sc.nextInt();
System.out.println(generate(length));
sc.close();
}
public static String generate(int length)
{
char passWord[]=new char[length];
for (int i = 0; i < passWord.length; i++)
{
int random = (int)(Math.random()*75);
while((random>'9'-'0'&&random<'A'-'0')
||(random>'Z'-'0'&&random<'a'-'0')
||random=='l'-'0')
{
random = (int)(Math.random()*75);
}
passWord[i]=(char)('0'+random);
System.out.println(passWord[i]);
}
String p = String.valueOf(passWord);
return p;
}
}
选做
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int length =sc.nextInt();
percentage(length);
sc.close();
}
public static void percentage(int length)
{
char passWord[]=new char[length];
int eng[] = new int[length];
for (int i = 0; i < passWord.length; i++)
{
int random = (int)(Math.random()*26);
passWord[i]=(char)('a'+random);
eng[passWord[i]-'a']++;
}
double per;
for (int i = 0; i < eng.length; i++)
{
if(eng[i]!=0)
{
per = eng[i]*1.0/eng.length*100;
char e = (char)('a'+i);
System.out.println(e+":"+eng[i]+" "+per+"%");
}
}
String p = String.valueOf(passWord);
}
}