スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    【Java】Arrays.asListは固定サイズ!

    とうとうJavaについての記事を書いてしまった。
    いや、まあ、だからどうということではないですが・・。

    Javaといいつつ作っているのはandroid。でもこれはJavaの問題だから、Javaってことで。

    Javaで配列をコレクションに変換するには、Arrays.asListを使うと楽ちん。
    で、ある配列から、ランダムに選んだ重複しない任意の数の要素を取り出したくていかのようなコードを組んだ。
    
    int count=7;//ほしい要素の数
    List<integer> baseList=Arrays.asList(baseArray);
     List<integer> newList= new ArrayList<integer>(count);
      Random r=new Random();
     for(int i=0;i<count;i++){
    int index= r.nextInt(baseList.size());
    newList.add(baseList.get(index));
    baseList.remove(index);
    }
    
    しかし、これを実行すると、baseList.remove(index);で落ちる・・・。
    最初は、ListにIntegerを使っているから、indexが要素のインデックスじゃなくて、値として認識されたか?
    とおもったけど、
    呼び出しの履歴を見れば、ちゃんとList<>.remove(int index)が呼ばれている。
    (List<>.remove(Object obj)ではなく)
    そりゃそうか、intとIntegerは同じようで違うもの。コンパイラが勝手にボクシング&アンボクシングして、
    相互変換しているだけだし・・・。

    では、なぜ?

    それは、ドキュメントヘルプに書いてあった。
    JDKのArrays.asListの項目
        指定された配列に連動する固定サイズのリストを返します。
        返されたリストへの変更は、そのまま配列に書き込まれます。
        (以下省略)

    ん? 固定サイズ?

    固定サイズ!

    コレクションなのに固定サイズ・・。
    だから、そもそも要素の削除ができないんだ・・。
    値書き換えたら配列の値も変わるって書いてあるし・・。

    すげ~。ある意味すげ~。
    .net Frameworkにこんなコレクションないよ~。

    JavaのList<>は、そもそもインターフェイスなんだよね。
    .net Frameworkだと、クラスだから、インスタンスによって挙動が違うとかないと思ってた・・。
    いや、そりゃ、List<>のインスタンス作る時、他のクラスの(ArrayListとか)インスタンス作って突っ込んでたから、
    知ってはいたよ。
    でも、実装されないメソッドがあるなんて・・。

    これのおかげでどんだけ時間食ったことか・・。
    C#とJava、コードが近いせいで、ついC#の先入観が邪魔をする・・。

    関係ないけど、Javaの規約のメソッド名は小文字からって、なれね~・・。


    スポンサーサイト

    テーマ : プログラミング
    ジャンル : コンピュータ

    コメントの投稿

    管理者にだけ表示を許可する

    No title

    List<Integer> l = new ArrayList<Integer>(Arrays.asList(new Integer[]{1, 2, 3, 4}));
    Collections.shuffle(l);
    for (Integer i : l) System.out.println(i);
    とか

    あと書いていて気づかされたけど
    Arrays.asList(new Integer[]{1,2,3,4}); は List<Integer> に見えるらしく、
    Arrays.asList(new int[]{1,2,3,4}); は List<int[]> に見えるらしいという・・・
    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。