Version 1 (modified by waue, 15 years ago) (diff) |
---|
Java 陣列內找值、加入新元素的問題與解法
使用 List & Iterator
問題:
如果一開始 String[] str = {"1","2","3"}; 代表已經定址為3個。但若之後要擴充,使得新值為第四個, 若用 str[3] = "oo" ,則會出現running time error,引發 java.lang.ArrayIndexOutOfBoundsException,詳細可見下面範例
static void pureArray() { String[] source_ip = { "st1", "st2", "st3" }; String[] str = { "0000", "st" }; if (source_ip.length == 0) { source_ip[0] = str[1]; // 錯誤!java無法直接操作定址 } else { boolean not_in_list = true; for (String si : source_ip) if (si == str[1]) { not_in_list = false; break; } if (not_in_list) { int len = source_ip.length; source_ip[len] = str[1]; // 錯誤!java無法直接操作定址 String[] tmp; } } for (String s : source_ip) { System.out.println(s); } }
解法:
static void ListAndIterator() { //# 假設宣告了一個 String 陣列 ArrayList<String> source_arr = new ArrayList<String>(); //# 假設此陣列已經有了三個元素 source_arr.add("st1"); source_arr.add("st2"); source_arr.add("st3"); //# 程式要找出 str 是否存在於陣列中,若沒有,則加入,否則結束 String str = "st1" ; //# ArrayList.contains()是個好用的函式,找出陣列中是否有此元素 if ( ! source_arr.contains(str[1])){ source_arr.add(str[1]); } //#接下來要取出串列List系列(如:ArrayList)的內容,可用List.iterator()來轉型 Iterator<String> source_it = source_arr.iterator(); while(source_it.hasNext()){ System.out.println(source_it.next()); } }
補充:
- Iterator 是個介面,因此無法直接Iterator it = new Iterator() 方式來宣告,只能找是否有iterator()的物件來轉型。
- java api 文件中有說明Iterator 有實做類別為Scanner,並且附上範例教學 (就大心A)
String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close();