使用用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;
}
開始動工
- 將上述得東西先裝起來
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))