Changes between Initial Version and Version 1 of waue/2009/1023


Ignore:
Timestamp:
Oct 29, 2009, 11:00:56 AM (15 years ago)
Author:
waue
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • waue/2009/1023

    v1 v1  
     1{{{
     2#!html
     3<div style="text-align: center; color: blue"><big
     4 style="font-weight: bold;"><big><big> Java 陣列內找值、加入新元素的問題與解法</big></big></big></div>
     5<div style="text-align: center"><big
     6 style="font-weight: bold;"><big> 使用 List & Iterator </big></big></div>
     7}}}
     8[[PageOutline]]
     9
     10
     11 = 問題: =
     12
     13如果一開始 String[] str = {"1","2","3"}; 代表已經定址為3個。但若之後要擴充,使得新值為第四個,
     14若用 str[3] = "oo" ,則會出現running time error,引發 java.lang.!ArrayIndexOutOfBoundsException,詳細可見下面範例
     15
     16{{{
     17#!java
     18        static void pureArray() {
     19
     20
     21                String[] source_ip = { "st1", "st2", "st3" };
     22                String[] str = { "0000", "st" };
     23
     24                if (source_ip.length == 0) {
     25                        source_ip[0] = str[1]; // 錯誤!java無法直接操作定址
     26                } else {
     27                        boolean not_in_list = true;
     28                        for (String si : source_ip)
     29                                if (si == str[1]) {
     30                                        not_in_list = false;
     31                                        break;
     32                                }
     33                        if (not_in_list) {
     34                                int len = source_ip.length;
     35                                source_ip[len] = str[1]; // 錯誤!java無法直接操作定址
     36                                String[] tmp;
     37                        }
     38                }
     39
     40                for (String s : source_ip) {
     41                        System.out.println(s);
     42                }
     43        }
     44}}}
     45
     46 = 解法: =
     47
     48{{{
     49#!java
     50        static void ListAndIterator() {
     51
     52                //# 假設宣告了一個 String 陣列
     53                ArrayList<String> source_arr = new ArrayList<String>();
     54                //# 假設此陣列已經有了三個元素
     55                source_arr.add("st1");
     56                source_arr.add("st2");
     57                source_arr.add("st3");
     58                //# 程式要找出 str 是否存在於陣列中,若沒有,則加入,否則結束
     59                String str =  "st1" ;
     60                //# ArrayList.contains()是個好用的函式,找出陣列中是否有此元素
     61                if ( ! source_arr.contains(str[1])){
     62                        source_arr.add(str[1]);
     63                }
     64                //#接下來要取出串列List系列(如:ArrayList)的內容,可用List.iterator()來轉型
     65                Iterator<String> source_it = source_arr.iterator();
     66                while(source_it.hasNext()){
     67                        System.out.println(source_it.next());
     68                }
     69
     70        }
     71}}}
     72
     73 = 補充: =
     74
     75 * Iterator 是個介面,因此無法直接Iterator it = new Iterator() 方式來宣告,只能找是否有iterator()的物件來轉型。
     76 * java api 文件中有說明Iterator 有實做類別為Scanner,並且附上範例教學 (就大心A)
     77
     78{{{
     79#!java
     80     String input = "1 fish 2 fish red fish blue fish";
     81     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     82     System.out.println(s.nextInt());
     83     System.out.println(s.nextInt());
     84     System.out.println(s.next());
     85     System.out.println(s.next());
     86     s.close();
     87}}}