第五章数组 实验目的 (1) 掌握一维 二维数组的定义及初始化方法 (2) 掌握循环结构域数组相结合解决问题的方法 (3) 理解数组下标和数组元素间的关系 (4) 掌握 List 类的使用方法 实验范例 1 静态数组 (1) 数组例 1:( 一维数组 ) 输入一行字符, 分别统计出其中英文字母 空格 数字和其它字符的个数 int digital = 0; int character = 0; int other = 0; int blank = 0; char[] ch = null; Scanner sc = new Scanner(System.in); String s = sc.nextline(); ch = s.tochararray(); // 将字符串转换成字符数组 for (int i = 0; i < ch.length; i++) { if (ch[i] >= '0'&& ch[i] <= '9') { digital++; else if ((ch[i] >= 'a'&& ch[i] <= 'z') ch[i] >'A'&& ch[i] <= 'Z') { character++; else if (ch[i] == ' ') { blank++; else { other++; System.out.println(" 数字个数 : " + digital); System.out.println(" 英文字母个数 : " + character); System.out.println(" 空格个数 : " + blank); System.out.println(" 其他字符个数 :" + other); 例 2:( 二维数组 ) 求一个 3*3 矩阵对角线元素之和
import java.util.scanner; Scanner scanner = new Scanner(System.in); int[][] number = new int[3][3]; System.out.println(" 请输入 9 个整数 :"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { number[i][j] = scanner.nextint(); System.out.println(" 输入的 3 * 3 矩阵是 :"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(number[i][j] + " "); System.out.println(); int sum = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { sum += number[i][j]; System.out.println(" 矩阵的对角线元素之和为 :" + sum); 2 列表类( 动态数组 ) 系统常用类 : (1) 列表类 :ArrayList Vector LinkedList 三个类均实现了 List 接口, 前两者是实现了数组结构, 后者是链表结构 ArrayList 和 Vector 的区别 :Vector 支持多线程同步, 但效率较低 ( 也就是说两个线程同时修改 Vector 会抛出异常 ) List 集合常用方法 :add clear contains get isempty remove size toarray ArrayList 类常用方法 :Add AddRange Remove RemoveAt RemoveRange Insert InsertRange ToArray ArrayList 继承自 List, 故 ArrayList 可使用 List 方法注 : 要实现队列 栈, 一般会使用 LinkedList 例 3: 使用 ArrayList
public static void main(string args[]) { List list = new ArrayList(); // 此处 ArrayList 类实现了 List 接口, 下面可直接使用 List 接口的方法 list.add("a"); // 添加元素 list.add("b"); list.add("c"); System.out.print(" 原来列表为 :"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); System.out.println(); System.out.println("list[0]=" + list.get(0)); // 取第 0 个元素 list.remove(0); // 删除元素 System.out.print(" 删除后列表为 :"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); System.out.println(); System.out.println("size=" + list.size()); // 显示列表大小 例 4: 使用 LinkedList 实现队列 栈的功能 LinkedList l = new LinkedList(); l.add("one"); l.add("two"); l.add("three"); l.add("four"); l.add("five"); System.out.println(l); // 队列 l.addlast("six"); // 相当于入队列的 Push 操作 l.removefirst(); // 相当于出队列的 Get 操作 System.out.println(l); // 栈 l.removelast(); // 相当于出栈的 Pop 操作 l.removelast(); l.addlast("seven"); // 相当于入栈的 Push 操作 System.out.println(l);
凡涉及 List 类排序的问题, 需要构造一个比较器 Comparator, 告诉编译器用什么方式来比较, 构造器的构造可参照下述程序的代码 另外, 例 5 中的泛型语法, 只能使用 Java1.5 以上的编译器版本, 对于 Java1.5 以下的版本, 只能通过构造类 (Class) 来实现实现比较器 Comparator, 具体请参照例 6 开启 Java1.5 版本的编译器方法 : 菜单 --> 项目 --> 属性 --> Java 编译器 --> 选择 JDK1.5 以上版本 例 5:( List 类的比较器 Comparator 构造问题 使用泛型构造, 只适用于 Java1.5 以上版本 ) 使用 List 类, 建立 2 条整数类型的序列, 并将它们合并 去重复 List<Integer> list1 = new ArrayList<Integer>(); // 泛型语法, 只能够 Java1.5 以上使用 List<Integer> list2 = new ArrayList<Integer>(); list1.add(1); list1.add(2); list1.add(3); list1.add(8); list2.add(3); list2.add(4); list2.add(5); list2.add(6); List<Integer> list = new ArrayList<Integer>(); list.addall(list1); list.addall(list2); System.out.println(list); // 构造比较器 Collections.sort(list, new Comparator<Integer>() { Public int compare(integer o1, Integer o2) { return o1 - o2; ); System.out.println(list); for (int i = 1; i < list.size(); i++) { if (list.get(i) == list.get(i - 1)) { list.remove(i); System.out.println(list);
注 : 下面例子 ( 例 6) 涉及 第七章类和对象 内容, 故可先看完第七章再看下面例子 例 6: 使用比较器 ( 使用类构造比较器, 适用于所有版本 ) 使用 List 建立学生 ( 类 ) 的列表, 并使用学生 ( 类 ) 的属性 :.name,.age 分别排序 ( 使用 List 的.sort 方法, 即便是简单的数据类型, 都要封装成 Object 类型 ) class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; public String getname() { return this.name; publicint getage() { return this.age; Public class Prog1 { Student zlj = new Student(" 丁晓宇 ", 21); Student dxy = new Student(" 赵四 ", 22); Student cjc = new Student(" 张三 ", 11); Student lgc = new Student(" 刘武 ", 19); //List<Student> studentlist = new ArrayList<Student>(); // 只能在 Java1.5 以上版本使用 List studentlist = new ArrayList(); studentlist.add(zlj); studentlist.add(dxy); studentlist.add(cjc); studentlist.add(lgc); Collections.sort(studentList, new SortByAge()); for (Iterator iter = studentlist.iterator(); iter.hasnext();) { Student st = (Student) iter.next(); System.out.println(st.getName() + " / " + st.getage()); System.out.println(" = "); Collections.sort(studentList, new SortByName()); for (Iterator iter = studentlist.iterator(); iter.hasnext();) { Student st = (Student) iter.next(); System.out.println(st.getName() + " / " + st.getage());
class SortByAge implements Comparator { // 年龄比较器 public int compare(object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; if (s1.getage() > s2.getage()) return 1; return 0; class SortByName implements Comparator { // 姓名比较器 public int compare(object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return s1.getname().compareto(s2.getname()); (2) 迭代器 :Iterator 遍历列表类也可以使用迭代器,Iterator 类常用方法 :hasnext(), Next() 例 7: List l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); // 迭代器用于 for 循环 for (Iterator iter = l.iterator(); iter.hasnext();) { String str = (String) iter.next(); System.out.println(str); // 迭代器用于 while 循环 Iterator iter = l.iterator(); while (iter.hasnext()) { String str = (String) iter.next(); System.out.println(str);
练习题目 5-1. 数组 a 中存有 n 个整数, 输出数组 a 中的值后, 输入一个正整数 m, 将 a 中各数顺序向 后移 m 个位置, 最后 m 个数变成最前面的 m 个数, 再输出数组 a 5-2. 有一个 3* 4 的矩阵, 每个元素的值是 100-999 之间的随机整数 找出该矩阵中每行元素 的最大值, 存入一个一维数组中 输出原始矩阵和结果矩阵 ( 随机数可使用 Math 类或 Random 类产生 ) 5-3. 将 1, 2, 6, 14, 25, 36, 37, 55 存入数组 a 输入一个数, 要求按原来的规律将该数插入数 组中, 按数组下标顺序输出所有元素 ( 提示再建一个数组 b, 元素个数比 a 多一个 ) 5-4. Arrays 类是 java.util 包中一个关于数组操作的系统类 数组 a 是 {1,3,7,30,45,70, 数组 b 为 {4,31,39,60,82,93, 分别用和不用 Arrays 类, 编写程序实现将 a 和 b 合并入数组 c, 并保 持升序排列 *5-5. 26 个英文字母围成一圈, 以字母 A 为 1, 依顺时针方向计数数到 5 的倍数时, 将对应 的字母划去, 知道所有字符都被划去时为止 ( 要求 : 使用 ArrayList) *5-6. 使用 List 类创建 9 个随机整数的序列, 按升序排序后, 删除中间的元素