1. 程式人生 > 其它 >基礎知識--方法,陣列等

基礎知識--方法,陣列等

加密計算器

package com.Leo.struct;

import java.util.Scanner;

public class calculate {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入密碼:");
int i = 3;
while (i>0) {
String passWord = scanner.nextLine();
if (passWord.equals("1qaz2wsxC")) {
System.out.println("密碼正確,歡迎使用");
System.out.println("請選擇功能:");
functionChoose(scanner.nextInt());
} else {
System.out.println("密碼錯誤,請重新輸入");
}
i--;
}
scanner.close();
}
public static void functionChoose(int i){
switch (i){
case 1:
myadd();
break;

case 2:
//mydid();
break;
}
}
public static void myadd(){
double sum = 0;
double numOfNum = 0;
System.out.println("請輸入數字,每個數字以回車結束,輸入其他字元退出功能:");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextDouble()){
double num = scanner.nextDouble();
numOfNum++;
sum += num;
System.out.println("當前"+numOfNum+"個輸入的數字和為"+sum);
}
System.out.println("總和為"+sum);
scanner.close();
}
}

方法過載

當存在相同的函式名,但形式引數不同的函式:

package com.Leo.method;


public class demo01 {
public static void main(String[] args) {
//修飾符 返回值型別 方法名(引數型別 引數名){方法體 return 返回值}
int max = max(1,2);
int max2 = max(1,4,5);
System.out.println(max);
System.out.println(max2);
}
public static int max(int a, int b){
int result = a;
if (a<b){
result = b;
}
return result;
}
public static int max(int a,int b,int c){
int result = a;
if(a<b){
result = b;
}
if (result<c){
result = c;
}
return result;
}
}

例如上例中,兩個比較大小的方法max(),且返回值均為Int型別,但實際上,max呼叫的是第一個函式,max2呼叫的是第二個函式;


規則

方法名必須相同

引數列表必須不同(個數不同、型別不同、或引數排列順序不同等)

方法的返回型別可以相同也可以不同

僅僅返回型別不同不足以成為方法的過載


可變引數

JAVA支援傳遞同類型的可變引數給一個方法:


在方法的宣告中,給指定的引數型別後邊加一個省略號

一個方法僅可指定一個可變引數,且必須是最後一個引數


遞迴

即自己呼叫自己;

能不用就不用遞迴

加密計算器改進

package com.Leo.method;

import java.util.Scanner;

public class MyCalculateTry2 {

public static void main(String[] args) {
MyCalculateTest myCalculateTest = new MyCalculateTest();
Scanner scanner = new Scanner(System.in);
boolean flag = true;
boolean flag2 = true;
int time = 1;
System.out.println("歡迎使用計算器");
while (flag2){
System.out.println("請輸入密碼:");
String pw = scanner.nextLine();
if (!pw.equals("1qaz2wsxC")){
System.out.println("輸入錯誤");
}else {
flag2 = false;
}
}
while (flag){
System.out.println("這是您第"+time+"次使用計算器");
if (time>1){
System.out.println("是否繼續使用計算器?");
String choice = scanner.next();
if (choice.equals("n")){//注意是"n",不是單引號'n'
flag = false;
break;
}
}
System.out.println("請輸入第一個數字");
double num1 = scanner.nextDouble();
System.out.println("請輸入所使用的計算方法:(+,-,*,/)");
String cal = scanner.next();
System.out.println("請輸入第二個數字");
double num2 = scanner.nextDouble();
double result = 0;
switch (cal){
case "+":
result = num1 + num2;
System.out.println(num1+"+"+num2+"="+result);
break;

case "-":
result = num1 - num2;
System.out.println(num1+"-"+num2+"="+result);
break;

case "*":
result = num1 * num2;
System.out.println(num1+"*"+num2+"="+result);
break;

case "/":
result = num1 / num2;
System.out.println(num1+"/"+num2+"="+result);
break;

default:
System.out.println("輸入有誤");
break;
}
time++;
}
scanner.close();
}
}

陣列

長度確定,一旦被建立,陣列的大小就不可以改變

陣列中的元素必須是相同型別的,不允許出現混合型別

陣列中的元素可以是任何資料型別,包括基本型別和引用型別

陣列變數屬於應用型別,陣列也可以看成是物件,陣列中的每一個元素相當於改物件的成員變數。陣列本身就是物件,JAVA中物件是在堆種的,因此陣列無論儲存原始型別還是其他物件型別,陣列物件本省是在堆中的


稀疏陣列

壓縮

應用場景:

當一個數組中大部分元素為同一個值(例如0)時,可以用稀疏陣列來儲存;

稀疏陣列會記錄陣列的行數和列數,並記錄有多少個不同的值;

例如

0 1 1 0 0 0

2 3 0 0 0 0

則稀疏陣列為


行 列 值

2 6 4

0 1 1

0 2 1

1 0 2

1 1 3


通過座標來記錄每個值的位置及值,可以起到壓縮空間的效果,提升效率

程式碼實操

package com.Leo.array;

public class ArrayDemo07 {
public static void main(String[] args) {
//建立一個二維陣列 11*11 0:無棋子;1:黑旗;2:白旗
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
System.out.println("輸出當前的棋子位置");
for (int[] ints:array1
) {
for (int anInt:ints
) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//轉換為稀疏陣列儲存
//獲取有效值的個數
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int i1 = 0; i1 < 11; i1++) {
if (array1[i][i1] != 0){
sum++;
}
}
}
System.out.println("有效值的個數:"+sum);
//建立一個稀疏陣列的陣列
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍歷二維陣列,將非零的值座標及值存在稀疏陣列中
int xIndex = 1;
int yIndex = 1;
for (int i = 0; i < array1.length; i++) {
for (int i1 = 0; i1 < array1[i].length; i1++) {
if (array1[i][i1]!=0) {
array2[xIndex][0] = i;
array2[xIndex][1] = i1;
array2[xIndex][2] = array1[i][i1];
xIndex++;
}
}
}
System.out.println("輸出稀疏陣列");
for (int i = 0; i < array2.length; i++) {
for (int i1 = 0; i1 < array2[i].length; i1++) {
System.out.print(array2[i][i1]+"\t");
}
System.out.println();
}
System.out.println("還原");
//還原陣列
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {

array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
for (int i = 0; i < array3.length; i++) {
for (int i1 = 0; i1 < array3[i].length; i1++) {
System.out.print(array3[i][i1]+"\t");
}
System.out.println();
}
}
}

結果:


輸出當前的棋子位置 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 有效值的個數:2 輸出稀疏陣列 11 11 2 1 2 1 2 3 2 還原 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000000000000

Process finished with exit code 0