数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环或者 foreach 循环。下面实例完整地展示了如何创建、初始化和操纵数组:
public class TestArray {
public static void main(String[] args) {
double[] myList = {1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i] + " ");
}
// 计算所有元素的总和
double total = 0;
for (int i = 0; i < myList.length; i++) {
total += myList[i];
}
System.out.println("Total is " + total);
// 查找最大元素
double max = myList[0];
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max) max = myList[i];
}
System.out.println("Max is " + max);
}
}
运行结果为:
1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5
JDK 1.5 引进了一种新的循环类型,被称为 foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。下面实例用来显示数组myList中的所有元素:
public class TestArray {
public static void main(String[] args) {
double[] myList = {1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for (double element: myList) {
System.out.println(element);
}
}
}
运行结果为:
1.9
2.9
3.4
3.5
数组可以作为参数传递给方法。下面的例子就是一个打印 int 数组中元素的方法:
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
下面例子调用 printArray 方法打印出 3,1,2,6,4 和 2:
printArray
(
new
int
[
]
{
3
,
1
,
2
,
6
,
4
,
2
}
)
;
再来看数组作为函数的返回值,以下实例中 result 数组作为函数的返回值:
public static int[] reverse(int[] list) {
int[] result = new int[list.length];
for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
result[j] = list[i];
}
return result;
}
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组,例如:
String
str
[
]
[
]
=
new
String
[
3
]
[
4
]
;
咱们再来看下多维数组的动态初始化(以二维数组为例),首先直接为每一维分配空间,格式如下:
type
arrayName
=
new
type
[
arraylenght1
]
[
arraylenght2
]
;
type 可以为基本数据类型和复合数据类型,arraylenght1 和 arraylenght2 必须为正整数,arraylenght1 为行数,arraylenght2 为列数,二维数组 a 可以看成一个两行三列的数组,实例如下:
int
a
[
]
[
]
=
new
int
[
2
]
[
3
]
;
再来呢,从最高维开始,分别为每一维分配空间,例如:
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
我们再来看解析。s[0]=new String[2] 和 s[1]=new String[3] 是为最高维分配引用空间,也就是为最高维限制其能保存数据的最长的长度,然后再为其每个数组元素单独分配空间 s0=new String("Good") 等操作。
再来就是多维数组的引用(以二维数组为例),对二维数组中的每个元素,引用方式为 arrayName[index1][index2],例如:
num
[
1
]
[
0
]
;
还算是比较简单的吧。然后我们来看数组倒序实例:
public class Test2 {
public static void main(String[] args){
int[] test= {1,2,4,5,7};
for (int i : test) {
System.out.print(i+" ");
}
System.out.println("\n");
test = Test2.reverse(test);
for (int i : test) {
System.out.print(i+" ");
}
}
public static int[] reverse(int[] arr){
int[] result = new int[arr.length];
for (int i = 0,j=result.length-1; i < arr.length; i++,j--) {
result[j] = arr[i];
}
return result;
}
}
我们再来实现数组和字符串的转换处理:
public class Test {
public static void main(String args[]) {
String str = "helloworld";
char[] data = str.toCharArray();// 将字符串转为数组
for (int x = 0; x < data.length; x++) {
System.out.print(data[x] + " ");
data[x] -= 32;
System.out.print(data[x] + " ");
}
System.out.println(new String(data));
}
}
然后看冒泡排序:
public class BubbleSort {
/**
* N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
* @param args
*/
public static void main(String[] args) {
int arr[] = {26,15,29,66,99,88,36,77,111,1,6,8,8};
for(int i=0;i < arr.length-1;i++) {//外层循环控制排序趟数
for(int j=0; j< arr.length-i-1;j++) {
//内层循环控制每一趟排序多少次
// 把小的值交换到前面
if (arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.print("第"+(i+1)+"次排序结果:");
//列举每次排序的数据
for(int a=0;a<arr.length;a++) {
System.out.print(arr[a] + "\t");
}
System.out.println("");
}
System.out.println("最终排序结果:");
for(int a = 0; a < arr.length;a++) {
System.out.println(arr[a] + "\t");
}
}
}
在来看选择排序:(比冒泡排序更快,运行次数更少):
public class Start
{
public static void main(String[] args)
{
int[] arr={20,60,51,81,285,12,165,51,81,318,186,9,70};
for(int a:arr)
{
System.out.print(a+" ");
}
System.out.println("\n"+"---------------从大到小---------------");
arr=toSmall(arr);
for(int a:arr)
{
System.out.print(a+" ");
}
System.out.println("\n"+"---------------从小到大---------------");
arr=toBig(arr);
for(int a:arr)
{
System.out.print(a+" ");
}
}
// 从大到小
public static int[] toSmall(int[] arr)
{
//遍历数组里除最后一个的其他所有数,因为最后的对象没有与之可以相比较的数
for(int i=0;i<arr.length-1;i++)
{
/*遍历数组里没有排序的所有数,并与上一个数进行比较
*“k=i+1”因为自身一定等于自身,所以相比没有意义
*而前面已经排好序的数,在比较也没有意义
*/
for(int k=i+1;k<arr.length;k++)
{
if(arr[k]<arr[i])//交换条件(排序条件)
{
int number=arr[i];
arr[i]=arr[k];
arr[k]=number;
}//交换
}
}
return arr;
}
// 从小到大
//和前面一样
public static int[] toBig(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int k=i+1;k<arr.length;k++)
{
if(arr[k]>arr[i])
{
int number=arr[i];
arr[i]=arr[k];
arr[k]=number;
}
}
}
return arr;
}
}
最后我们来实现一个小游戏。就是程序随机产生5个按一定顺序排列的字符,作为猜测结果。玩家可以猜测多次,每猜一次,若猜测的完全正确则游戏结束,并计算玩家的游戏得分并输出。若没有猜对,则提示猜测结果,如猜对了几个字符,以及猜对了几个字符的位置信息,并提示玩家游戏继续。若中途输入EXIT,则游戏提前结束。
大概明白了么???我们来结合代码感受下哦:
import java.util.Scanner;
//猜字符小游戏
public class Guessing {
private static Scanner scan;
// 主方法
public static void main(String[] args) {
scan = new Scanner(System.in);
char[] chs = generate();
System.out.println(chs);
int count = 0; // 猜错的次数
while (true) { // 自造死循环
System.out.println("猜吧!");
String str = scan.next().toUpperCase(); // 获取用户输入的字符串
if (str.equals("EXIT")) { // 判断字符串内容相等
System.out.println("下次再来吧!");
break;
}
char[] input = str.toCharArray(); // 将字符串转换为字符数组
int[] result = check(chs, input);
if (result[0] == chs.length) { // 对
int score = 100 * chs.length - 10 * count;
System.out.println("恭喜你,猜对了!得分为:" + score);
break;
} else {
count++;
System.out.println("字符对个数为:" + result[1] + ",位置对个数为:" + result[0]);
}
}
}
// 生成随机字符数组chs
public static char[] generate() {
char[] chs = new char[5];
char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z' };
boolean[] flags = new boolean[letters.length];
for (int i = 0; i < chs.length; i++) {
int index;
do {
index = (int) (Math.random() * letters.length);
} while (flags[index] == true);
chs[i] = letters[index];
flags[index] = true;
}
// i=0 index=0 chs[0]='A' flags[0]=true
// i=1 index=25 chs[1]='Z' flags[25]=true
// i=2 index=0/25/0/25/1 chs[2]='B' flags[1]=true
return chs;
}
// 对比:随机字符数组chs与用户输入的字符数组input
public static int[] check(char[] chs, char[] input) {
int[] result = new int[2]; // (0,0)
for (int i = 0; i < chs.length; i++) {
for (int j = 0; j < input.length; j++) {
if (chs[i] == input[j]) {
result[1]++;
if (i == j) {
result[0]++;
}
break;
}
}
}
return result;
}
}
好啦,这次就到这里了哦。