wiki:waue/2009/1023
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(); 
Last modified 14 years ago Last modified on Oct 29, 2009, 11:00:56 AM