Java第02次实验(Java基本语法与类库)

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对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值