[Java]陣列應用-查字典

[Java]陣列應用-查字典

目錄
1.解題思路
2.開始動工
3.自尋死路

使用用array和function,將輸入的string存到array當中,並計算數量。

解題思路

1.使用2個array,一個存取輸入的string,一個輸入該string數量。

String[] strs = new String[2];
int[] strsn = new int[2];

2. 使用3個function

2.1 回傳某string在陣列裡的index
FIWK(想要找的array,想要找的string,想要從頭找到第幾個),並回傳某string的index,找不到會回傳-1。

public static int FIWK(String[] arr, String key, int count) {
for (int i = 0; i < count; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

2.2當array空間不足時,讓空間*2,但要做2個不同的因為,兩個array不同,一個是string,一個是int。

2.2.1 string的

public static String[] DA(String[] strs) {
String[] newstrs = new String[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

2.2.2 int的

public static int[] DAint(int[] strs) {
int[] newstrs = new int[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

開始動工

  1. 將上述得東西先裝起來

strs:裝string的陣列

srtsn:裝該string數量的陣列

import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];
}

public static int FIWK(String[] arr, String key, int count) {
for (int i = 0; i < count; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

public static String[] DA(String[] strs) {
String[] newstrs = new String[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

public static int[] DAint(int[] strs) {
int[] newstrs = new int[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

}

2.製作一個while迴圈,能不停輸入東西,並於輸入-1時停止。

import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];

while (true) {
String str = sc.nextLine();
if (str.equals("-1"))
break;
}
}

public static int FIWK(String[] arr, String key, int count)

public static String[] DA(String[] strs)

public static int[] DAint(int[] strs)

}

3.新增一個int 變數count,表示現在string的種類數量。此外使用function,在array空間不夠時,將空間擴大。

import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];
int count = 0;

while (true) {
String str = sc.nextLine();
if (str.equals("-1"))
break;
if (strs.length == count) {
strs = DA(strs);
strsn = DAint(strsn);
}
}
}

public static int FIWK(String[] arr, String key, int count)

public static String[] DA(String[] strs)

public static int[] DAint(int[] strs)

}

4. 創建int index來存取 function FIWK回傳的值。

import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];
int count = 0;

while (true) {
String str = sc.nextLine();
if (str.equals("-1"))
break;
if (strs.length == count) {
strs = DA(strs);
strsn = DAint(strsn);
}
int index = FIWK(strs, str, count);
if (index == -1) {
strs[count] = str;
index = count++;
}
strsn[index]++;
}
}

public static int FIWK(String[] arr, String key, int count)

public static String[] DA(String[] strs)

public static int[] DAint(int[] strs)

}

4.1詳細解釋此段程式碼

int index = FIWK(strs, str, count);
if (index == -1) {
strs[count] = str;
index = count++;
}
strsn[index]++;

以下用比較好理解的寫法

如果是-1,新增此string,並在此紀錄此sting數量的地方(strsn[count])+1。並讓string種類(count)+1。

如果不是,在此紀錄此sting數量的地方(strsn[index])+1。

int index = FIWK(strs, str, count);
if (index == -1) {
strs[count] = str;
strsn[count]++;
count++;
}
else{
strsn[index]++;
}

無論是有輸入過的或沒輸入過的,都要在紀錄該string數量的地方+1。所以可以把else拿掉。如果是新出現的string,使用index = count就能使strsn[index]指向新增的string。

if (index == -1) {
strs[count] = str;
index = count;
count++;
}
strsn[index]++;

再用後綴簡化

if (index == -1) {
strs[count] = str;
index = count++;
}
strsn[index]++;

5.輸出陣列(完整程式碼)

import java.util.Arrays;
import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];
int count = 0;

while (true) {
String str = sc.nextLine();
if (str.equals("-1"))
break;
if (strs.length == count) {
strs = DA(strs);
strsn = DAint(strsn);
}
int index = FIWK(strs,str,count);
if(index == -1){
strs[count] = str;
index = count++;
}
strsn[index]++;
}
System.out.println(Arrays.toString(strs));
System.out.println(Arrays.toString(strsn));
}

public static int FIWK(String[] arr, String key, int count) {
for (int i = 0; i < count; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

public static String[] DA(String[] strs) {
String[] newstrs = new String[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

public static int[] DAint(int[] strs) {
int[] newstrs = new int[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

}

自尋死路

本來想減少FIWK的參數,所以把count刪除,並將條件改寫成下面粗體。

public static int FIWK(String[] arr, String key) {
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

執行後(粗體為改寫的地方)。

import java.util.Arrays;
import java.util.Scanner;

public class test03 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
int[] strsn = new int[2];
int count = 0;

while (true) {
String str = sc.nextLine();
if (str.equals("-1"))
break;
if (strs.length == count) {
strs = DA(strs);
strsn = DAint(strsn);
}
int index = FIWK(strs,str);
if(index == -1){
strs[count] = str;
index = count++;
}
strsn[index]++;
}
System.out.println(Arrays.toString(strs));
System.out.println(Arrays.toString(strsn));
}

public static int FIWK(String[] arr, String key) {
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

public static String[] DA(String[] strs) {
String[] newstrs = new String[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

public static int[] DAint(int[] strs) {
int[] newstrs = new int[strs.length * 2];
for (int i = 0; i < strs.length; i++)
newstrs[i] = strs[i];
return newstrs;
}

}

at test03.FIWK(test03.java:34)是指此行。

if (arr[i].equals(key))

這個錯誤是指arr[i]是null沒辦法使用.equals()。

因為當第一次存string的時候,strs這個array裡面並沒有東西。

當跑回圈,i = 0時,arr[0]會回傳null。

if (arr[0].equals(key))

會變成,

if (null.equals(key))

然後就會報錯。

舉個例子:

public class test02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] strs = new String[2];
System.out.println(strs[0]);
strs[0].equals("hi");
}
}

那這樣為什麼原本寫法不會有這樣的問題。

public static int FIWK(String[] arr, String key, int count) {
for (int i = 0; i < count; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

因為在輸入第一個string的時候,count是0。

public static int FIWK(String[] arr, String key, int count) {
for (int i = 0; i < 0; i++) {
if (arr[i].equals(key))
return i;
}
return -1;
}

當i = 0時就不符條件,沒有執行迴圈。所以不會有以下狀況發生。

null.equals(key))