1.PTA
2.1 jmu-Java-02基本语法-01-综合小测验 (9 分)
2.2 jmu-Java-02基本语法-02-StringBuilder (5 分)
2.3 jmu-Java-02基本语法-03-身份证排序 (9 分)
2.6 jmu-Java-02基本语法-04-动态数组 (8 分)
2.5 jmu-Java-02基本语法-05-浮点数的精确计算 (5 分)
2.7 jmu-Java-02基本语法-08-ArrayList入门 (10 分)
1.1 综合小测验
对于控制台输入的处理,nextLine()方法与其他nextXXX方法混用会产生吞回车问题。建议全部使用Scanner.nextLine()处理输入以免碰到行尾回车换行问题。
处理方法:用Integer 转化的方法:
String -> int |
---|
int i=Integer.parseInt(“123”); //注意一定要是纯数字 |
知识点:
- Eclipse自动生成快捷键解Alt+\
1.输入:switch Alt+
效果:
switch (key) {
case value:
break;
default:
break;
}
2.输入:for Alt+
效果:
for (int i = 0; i < args.length; i++) {
}
3.输入:while Alt+
效果:
while (condition) {
}
4.输入:sysout Alt+
效果:
System.out.println();
5.输入:main Alt+
效果:
public static void main(String[] args) {
}
- 使用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)
例题:
1.2 身份证排序
总结:
sort1可直接使用Arrays.sort(因为Arrays.sort不仅可用于整数的排序还可用于字符串的排序),String的subString。
采用结构化编程方式,针对sort1、sort2各写一个方法处理。nextInt()与nextLine()混用可能产生错误的后果。建议:全部使用Scanner的nextLine()处理输入以免碰到行尾回车换行问题。
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n;//全局变量
static String[] strId;//全局变量
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=Integer.valueOf(sc.nextLine());//输入身份证号的个数
strId=new String[n];
for(int i=0;i<n;i++) {//输入n个身份证号
strId[i]=sc.nextLine();
}
while(sc.hasNext()) {
String choice=sc.nextLine();
switch (choice) {//注意一下switch-case的用法
case "sort1":
sort1Method(sc);
break;
case "sort2":
sort2Method(sc);
break;
default:
System.out.println("exit");
break;
}
}
}
private static void sort2Method(Scanner sc) {
String[] str2=new String[n];
for(int i=0;i<n;i++) {
str2[i]=strId[i].substring(6,14);
}
Arrays.sort(str2);//字符串数组也可以直接使用Arrays.sort()进行比较
//利用双重循环看身份证号中是否有排序后的年月日,找到则输出对应的身份证号
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(strId[j].contains(str2[i])) {
System.out.println(strId[j]);
break;
}
}
}
}
private static void sort1Method(Scanner sc) {
String[] str1=new String[n];
for(int i=0;i<n;i++) {
str1[i]=strId[i].substring(6,10)+"-"+strId[i].substring(10,12)+"-"+strId[i].substring(12,14);
}
Arrays.sort(str1);
for(int i=0;i<n;i++) {
System.out.println(str1[i]);
}
}
}
- Arrays.sort():排序
- String的subString:截取字符串
1.3 StringBuilder
代码:
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNextInt()) {//实现多轮输入
int n=sc.nextInt();
int begin=sc.nextInt();
int end=sc.nextInt();
StringBuilder str=new StringBuilder("");//StringBuilder类代表可变字符串对象
for(int i=0;i<n;i++) {
str.append(i);//append()方法 相当于"+"
}
System.out.println(str.substring(begin,end));//字符串截取与输出
}
}
}
- StringBuilder的用法:StringBuilder类代表可变字符串对象、append()方法 相当于“+“。常把二者结合用于字符串拼接。
StringBuilder str=new StringBuilder("");
str.append(i);
-
字符串连接,用+进行连接,其实内部也是通过StringBuilder的append来实现的;
-
一般情况进行字符串拼接用+就可以,系统内部会进行优化,但是如果是循环拼接,则需要用StringBuilder的append来实现;
-
原因:因为如果是循环拼接,那么系统会在循环体内部创建StringBUilder,这样会造成空间浪费;而用StringBuilder进行显示拼接时,可以定义在外面,减少内存的消耗
-
java中字符串拼接的5种方法
更多StringBuilder 的用法参考StringBuilder类的使用总结
2.4 动态数组
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
int n=Integer.valueOf(sc.nextLine());
String arr[][]=new String[n][];//动态创建第一维
for(int i=0;i<n;i++) {
arr[i]=new String[i+1];//动态创建第二维
for(int j=0;j<=i;j++) {
arr[i][j]=(i+1)+"*"+(j+1)+"="+(i+1)*(j+1);
/*控制行末无空格*/
if(i==j) {
System.out.println(arr[i][j]);
}
else if(i>j) {
System.out.printf("%-7s",arr[i][j]);//“-”为向左对齐,7代表7个字符
}
}
}
System.out.println(Arrays.deepToString(arr));
}
}
}
动态生成不规则大小的数组。定义数组时,数组第一维需事先确定大小,第二维大小可在程序运行中动态确定。
在本题中String arr[][]=new String[n][];//动态创建第一维
,arr[i]=new String[i+1];//动态创建第二维
。
- Arrays.deepToString():打印二维数组中的内容:
Arrays.deepToString()主要用于数组中还有数组的情况,而Arrays.toString()则相反,对于Arrays.toString()而言,当数组中有数组时,不会打印出数组中的内容,只会以地址的形式打印出来。 - System.out.printf用法(格式化输出):
格式控制字符 | 结果 |
---|---|
%8d | 整数,右对齐,输出宽度为8 |
%-6d | 整数,左对齐,输出宽度为6 |
%-7s | 字符串,坐对齐,代表共有7个字符 |
%8f | 浮点数,右对齐,输出宽度为8 |
%.2f | 浮点数,精确到百分位 |
%16.3f | 浮点数,精确到千分位,输出宽度为16 |
2.5 ArrayList入门
- 代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
List<String> strList=new ArrayList<>();
while(true) {//直到遇到!!end!!结束输入
String s=sc.next();
if(s.equals("!!end!!")) {//判断该字符串中是否具有!!end!!
break;
}
strList.add(s);
}
strList.add(0,"begin");//插入头部
strList.add("end");
System.out.println(strList);
String str=sc.next();
System.out.println(strList.contains(str));//是否包含true/false
System.out.println(strList.indexOf(str));//找到返回下标,没找到,返回-1
//从后往前找即 返回str在此字符串中最后一次出现处的索引,如果此字符串中没有str,则返回 -1。
System.out.println(strList.lastIndexOf(str));
System.out.println(strList.get(0));
strList.remove(0);
System.out.println(strList);
str=sc.next();
strList.set(1, str);
System.out.println(strList);
str=sc.next();
List<String> strList1=new ArrayList<>();
for(int i=0;i<strList.size();i++) {
if(strList.get(i).contains(str)) {//先get:返回此列表中指定位置上的元素再判断是否包含
strList1.add(strList.get(i));
}
}
System.out.println(strList1);
strList.remove(str);
System.out.println(strList);
strList.clear();
System.out.println(strList+","+strList.size()+","+strList.isEmpty());
}
}
新建一个ArrayList<String> strList
用来存放字符串:List<String> strList=new ArrayList<>();
ArrayList的常用方法:add(e)、add(index, e)
- add(e):将指定的元素添加到此列表的尾部。
- add(index, e):将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。
使用ArrayList可以代替数组,见如下代码,ArrayList用法请参考JDK文档。
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
//泛型,Integer
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(new Integer(1));//和上句效果一样
for (Integer e : integerList) {
System.out.println(e);
}
//泛型,String
List<String> strList = new ArrayList<String>();
strList.add(1+"");
strList.add("abc");
strList.set(0, "def");//随机存取,设置0号位置的元素
for (int i = 0; i < strList.size(); i++) {
System.out.println(strList.get(i));
}
}
}
- ArrayList的其它常用用法:
方法 | 作用 |
---|---|
contains(Object o) | 如果此列表中包含指定的元素,则返回 true。 |
get(int index) | 返回此列表中指定位置上的元素。 |
indexOf(Object o) | 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。 |
isEmpty() | 如果此列表中没有元素,则返回 true |
remove(int index) | 移除此列表中指定位置上的元素。 |
set(int index, E element) | 用指定的元素替代此列表中指定位置上的元素。 |
size() | 返回此列表中的元素数。 |
2.5 浮点数的精确运算
浮点数不精确,使用BigDecimal解决。如果直接使用double类型数据进行运算,无法得到精确值。
【BigDecimal是什么?】
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
- BigDecimal对象的构造:以字符串的方式构造
eg.
BigDecimal first=new BigDecimal("36");
BigDecimal second=new BigDecimal("12");
- 熟悉以面向对象的方式进行各种操作(加减乘除)
操作 | 写法 |
---|---|
加 | first.add(second) |
减 | first.subtract(second) |
乘 | first.multiply(second) |
除 | first.divide(second) |
- BigDecimal的不可变性,如何体现?
BigDecimal是不可变类,每个操做(加减乘除等)都会返回一个新的对象, 下面以加法操做为例。
BigDecimal a =new BigDecimal("1.22");
System.out.println("construct with a String value: " + a);
BigDecimal b =new BigDecimal("2.22");
a.add(b);
System.out.println("a plus b is : " + a);
很容易会认为会输出:
construct with a String value: 1.22
a plus b is :3.44
但实际上a plus b is : 1.22
由于BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,因此a.add(b)虽然作了加法操做,可是a并无保存加操做后的值,正确的用法应该是a=a.add(b); 减乘除操做也是同样的返回一个新的BigDecimal对象。