1 名前:デフォルトの名無しさん [2010/05/01(土) 12:46:59 ] 1 名前:デフォルトの名無しさん[] 投稿日:2010/03/16(火) 10:23:04 プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 ttp://pc11.2ch.net/hp/ Webプログラミング ttp://pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 ttp://www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド ★★Java質問・相談スレッド137★★ pc12.2ch.net/test/read.cgi/tech/1268702584/ 次スレは>>950 あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 ttp://www.wikiroom.com/java/
83 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:24:46 ] え?SetはCollectionだからIterableだろ?
84 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:07:44 ] >>83 それはJava Collection Frameworkの実装の都合だろ。 setてのはふつう順不同というか要素の前後関係は知らないもんだろ。 そういう用途はlinkedlistだ。 たとえIteratorを持ってたとしてもputやsetした順に 取得できる保証もないし前後関係を知らないんだからprevで要素が取れるわけもない。 LinkedHashSetがあがってるがこれは実装由来のコレクション。特殊な要件で使うもんだ。
85 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:30:57 ] >>84 SetがIterableであることが、実装上の都合だという ソースはどこにあります?
86 名前:デフォルトの名無しさん [2010/05/04(火) 16:53:06 ] 実装されているが、仕様に規定がないなら、それは実装上の都合ということ。 ないことは示せない。あえて示すならこの世の仕様をすべて見ろと言うしか無い。
87 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:07:26 ] いや、意味が分からないんだが。IterableはCollectionの契約だろ? まあ気にくわないならUnsupportedOperationExceptionでも投げればいいけど。 正直何をいいたいのかさっぱり。
88 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:46:07 ] お前がコレクションやらコンテナと呼ばれるものの使い方を理解してないだけだろ。 だいたいLinkedHashSetは既存のsetを守りつつ順序を保ちたいときに使うラッパーだ。 IterableなのはCollectionインターフェイスで強制されてるからだ。
89 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:49:27 ] >>87 たぶん 「Setってーのは重複要素がないコレクションなんだぜ。」 「Setの実装クラスが何を持とうとそれは実装都合なんだぜ。」 「CollectionってーのはIterableだが、順序付けされているかそうでないかは実装クラス次第なんだぜ。」 ってことをいいたいんじゃないのかな。
90 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:55:52 ] >>89 いや、>>82 でSetにイテレータ無いって言ってるから どういう意味かと思って。
91 名前:89 mailto:sage [2010/05/04(火) 18:17:25 ] >>90 それは、ミスったんじゃないかな。>>84 で、 「Iteratorがあっても(入れた時の)順序を保障するものではない。」※括弧内はおれ補完 と記載されているし。 ところで、なんだかIteratorとIterableをゴチャゴチャに書かれている書き込みが多い気がする。
92 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 18:29:49 ] Collectionの話してるんだ。混ぜて構わんだろ。
93 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 18:44:50 ] 列挙性とその順序性は全く別の話。 分かっていないバカが一匹混ぜ繰り返している。
94 名前:デフォルトの名無しさん [2010/05/04(火) 22:36:28 ] あるメソッドの中だけ別のpackageを参照するように出来ますか? クラスのあたまで import org.easymock.EasyMock; とやると そのクラスのメソッド内で EasyMock. と呼び出すと上のパッケージのクラスを参照するじゃないですか? で、あるメソッドだけ org.easymock.classextension.EasyMock のクラスを参照したいのですが、上記のようにフル修飾名をいちいち入れるとソースが見づらくなるので、あたまでなんか宣言して、そのメソッドだけ別のパッケージを参照するように出来ませんでしたっけ? 方法ありましたらお願いします
95 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 23:05:43 ] JavaScript なら出来るが。
96 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 23:31:04 ] Effective Java 2版 140p に通常のキャストと Class.cast の説明があったのですが、意味がよく分かりませんでした。 class Favorites { private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); // Class.cast public <T> T getFavorite(Class<T> type) { return type.cast(favorites.get(type)); } // キャスト演算子 public <T> T getFavorite(Class<T> type) { return (T)favorites.get(type); } } 上記の Class.cast を使う場合ととキャスト演算子を使う場合ではどのような差があるのでしょうか? この二つに差があるのだとしたら、どのようなときにどう使い分けるのでしょうか? どうかお願いします。
97 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:04:29 ] >>96 public Favorites() { favorites.put(Integer.class, "string"); } と変なもの入れて Favorites f = new Favorites(); try { System.out.println(f.getFavoriteCast(Integer.class)); } catch (Exception e) { e.printStackTrace(); } try { System.out.println(f.getFavorite(Integer.class)); } catch (Exception e) { e.printStackTrace(); } と使ってみるといい。f.getFavoriteCastはClass.cast版ね。
98 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 02:09:36 ] 質問です。 getClass()メソッドのテストをしようと思い、次のようなソースを実行しました。 配列int[]とStringクラスでgetClass()を行い、結果をprintln()で出力するものです。 出力結果の" class [I "というのはどういう意味なんでしょうか? (てっきり"class java.lang.reflect.Array"あたりが出力されると思ったのですが…) そもそも配列にgetClass()を行うのは好ましくないのでしょうか? 【ソース】 public class Test1 { public static void main(String[] args){ int[] a = {1,2,3}; System.out.println(a.getClass()); System.out.println((new String("abc")).getClass()); } } 【出力結果】 class [I class java.lang.String 以上です。 どうぞよろしくお願いします。
99 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 02:22:42 ] >>98 java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#14152
100 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 02:37:47 ] >>99 こんな仕様があったとは知りませんでした。勉強になります。 夜遅くにご回答いただき、どうもありがとうございました。
101 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 04:33:17 ] >>97 キャスト演算子は型が一致しなくても放置で Class.cast は型が一致しなければ ClassCastException を投げる の違いということですか?
102 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 06:34:21 ] Class#castだと Integer.class.cast("") とかコンパイル通っちゃう。
103 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:55:29 ] そんな珍しいコードよう書かんわw ちなみに、ジェネリックスとの組み合わせは分かりにくくなる罠。 現状のジェネリックスはある種のトリックだから。 www.ibm.com/developerworks/jp/java/library/j-jtp01255/
104 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 15:37:01 ] class ClassA { private String name=null; ClassA(String name) { this.name=name; } String getName() { return name; } void setName(String name) { this.name=name; } } class ClassB { static void method1(ClassA c) { c.setName("Method 1"); } static void method2(ClassA c) { c=new ClassA("Method 2"); } } とあったとき ClassA a=new ClassA("Class A"); System.out.println(a.getName()); ClassB.method1(a); System.out.println(a.getName()); ClassB.method2(a); System.out.println(a.getName()); としたら Output: Class A Method 1 Method 2 ってなるよね?
105 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:00:45 ] >>104 最後のMethod 2はMethod 1のままだろ。 Javaでは参照渡しはできない。参照の値渡しなら出来る。
106 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:39:21 ] なるほど・・・残念
107 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 19:08:05 ] Class.cast なんて初めて知った どっちも実行時に型チェックして例外投げると思うんだが何が違うの?
108 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 19:25:43 ] >>97 で相違動作のサンプルまで書いてあるじゃねーか。
109 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 19:28:47 ] 未チェック警告抑止しなきゃならない時に手元に Class オブジェクトがあれば Class#cast() でやってる。 private final Map<String,Object> values = new HashMap<String,Object>(); public <T> T getValue(String key, Class<T> type){ Object value = values.get(key); if(value == null) return value; assert(type.isAssignableFrom(value.getClass()): value.getClass().getSimpleType(); return type.cast(value); }
110 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 19:48:08 ] >>97 やってみたけどf.getFavoriteが例外投げないのは何故? 通常のキャストも実行時の型チェックやってるよね?
111 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 20:01:52 ] >>110 ジェネリクスのイレイジャ機構により、 おそらくキャストしてる方は実行時Integer型ではなく Object型そのまんまで扱ってる。(実行時に型情報は消えるから) ただ、もちろん Integer i = f.getFavoriteCast(〜〜); とすればClassCastExceptionが発生する。
112 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 20:02:21 ] >>109 Classオブジェクトが無いときはどうするの?
113 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 20:11:57 ] >>112 Classを用意できない場合ってあるかい?
114 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 20:14:46 ] curses的なことができる何かってないですか? jcursesというのとlibjcsiというのを使ってみたけど、 マルチバイト文字に対応してない?っぽいので、 いいの知ってる方教えてください。
115 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 21:13:38 ] >>113 1.5以前とか総称型を想定してないのとか
116 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:14:47 ] 普通のプログラミングとネットワークプログラミングは別なんでしょうか? ネットワークプログラミングを習得しないといけないことになったんですが 即ネットワークプログラミング? 普通のプログラミング習得⇒ネットワーク? プログラムに関してはC言語をファイルの入出力なんかあたりまでやった程度です。
117 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:15:18 ] jcursesもlibjcsiなんかして日本語通ったはずだが忘れた。 CHARVAは無理だった。
118 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:16:51 ] 1.5以前というか総称型以前はそもそも未チェック警告が無いからキャストで 問題なかったはず。
119 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:29:24 ] >>116 普通の業務アプリではネットワークプログラミングはしません。 そういう意味では別です。それ以外を除けば別じゃありません。 ネットワークプログラミングというのは、 簡単に言えば、ちょっと面倒くさいファイル入出力です。
120 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:38:55 ] プロトコル考えなきゃ行けないからちょっとでは済まんだろw
121 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 22:40:20 ] じゃあ面倒くさいファイル入出力でいいよ。
122 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:02:44 ] ファイル入出力もネットワーク入出力も同じようなもの。には同意。 「普通」って発言にはちょっと引っかかるな。 自分トコだとJavaサーバと.Netリッチクライアントが「普通」なんだが。 また別のトコだとWEBアプリが「普通」だったり、Excel+ODBCが「普通」だったり。 RubyサーバにJavaリッチクライアントが「普通」なんてトコもある。 皆それぞれに「普通」。
123 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:04:34 ] >>118 そういう意味じゃなくて、総称型を想定しないで作ったクラスだとメソッドの追加が必要になるけど言語仕様ごとにクラスの修正やメソッドの追加は出来ないってこと。 ほとんどのクラスはもともと総称型を意識しないような設計だからClassをいちいち用意できない。
124 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:07:58 ] 同じ様なものって、ストリーム型入出力の基礎の基礎のところだけじゃねえか。 まともに使おうと思ったら相手方のアプリの知識も非同期処理の知識も、 もちろんバークレイソケットの知識も必要になる。プロトコルによっては 状態管理もパケ落ち対応も必要。
125 名前:116 mailto:sage [2010/05/05(水) 23:10:12 ] 文字見ただけで難しそうですね・・・ P2PにおけるDHT関連をやるんですが。
126 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:43:01 ] >>124 詳細言い出したらキリないだろうが。 ファイル入出力だってファイルシステム言い出したらキリないし、 そもそもフォーマットはどうだの、即時追記に対応するだの、 クラッシュ時安全にするだの、あるよ。 お前はいちいち全部言わないと気が済まないのか
127 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 23:59:38 ] >>125 P2PでDHTとかってのは業務的なことでネットワークプログラミング の範疇に入れるべきなのだろうか? スレッド間でロジックをシミュレートすることだって出来る部分だし。 確かどっかでアプレット見た気がする。ノード毎に伝搬していく様子の。
128 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:09:16 ] あ、スマン。それ言い始めたらアプリケーション層のアプリって軒並み ネットワークじゃねぇってことになる。
129 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:13:04 ] >>126 それらを同じ様なものと言いのける低脳。
130 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:26:18 ] スーパークラスのメソッド呼ぶときって必ずsuper.method();ってしたほうがいいの? つまり class ClassA { void hoge() { System.out.println("Hoge!"); } } class ClassB extends ClassA { void hogehoge() { super.hoge(); //← super. つけたほうがいいの? hoge(); //← super. つけないほうがいいの? } } classBでhoge()をオーバーライドしてないとして
131 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:36:37 ] >>130 どっちでもいい。 むしろhoge()のほうをthis.hoge()にしてほしいわ。
132 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:49:24 ] >>131 スーパークラスのメソッドってthis.で呼び出せるって知りませんでした。勉強になりました。 ありがとうございます
133 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 00:51:05 ] >>131 ちなみにsuper使う場合もthisってつけたほうがいいんですか? this.super.hoge(); ? super.this.hoge(); ? なんか細かいことばっか訊いてすみません
134 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 03:12:26 ] >>94 static import? リフレクション?
135 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 03:26:56 ] >>84 > >>83 > それはJava Collection Frameworkの実装の都合だろ。 > setてのはふつう順不同というか要素の前後関係は知らないもんだろ。 > そういう用途はlinkedlistだ。 > > たとえIteratorを持ってたとしてもputやsetした順に > 取得できる保証もないし前後関係を知らないんだからprevで要素が取れるわけもない。 そもそもあるコレクションにlistIterator()メソッドがないとprevious()が使えない。 コレクションによってはiterator()メソッドしか実装されてないのがある。 > LinkedHashSetがあがってるがこれは実装由来のコレクション。特殊な要件で使うもんだ。 SortedSet、TreeSetもComparableが実装されたオブジェクトをadd()できるから (挿入ソートで挿入したときにComparable#compareTo()が働いて自動的に順番が並ぶ) 順序関係は保証される。これも特殊だと? LinkedHashSetとArrayListとの違いはオブジェクトが重複を許すか許さないかの違いでしか無いと思うが。 使えるメソッドも若干違うが。
136 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 03:36:15 ] 抽象化と実装仕様の区別も付いていない人が何で Java なんかやってんの?
137 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 03:44:21 ] >>132 >>133 なぜthisやsuperをつけるのかわかってないような気がする。 途中からClassBにhoge()という名前のメソッドを 新たに作ることになったとき(hogeをオーバーライド)は、thisをつけると 新たに作ったメソッドのほうが呼ばれるのだが。 後でhoge()メソッドをオーバーライドするときに備えてsuperというキーワードが用意されている。 いかなる状況でもClassAのhoge()メソッドを呼び出したいのに、あとからClassBのhoge()メソッドを実装すると なぜかClassBのhoge()メソッドを呼び出してしまう。そういう問題を防ぐために、superというキーワードがある。 だから将来のオーバーライドや、同じ名前のメソッド名衝突に備えてsuperクラスのメソッドを呼びたいときはsuperをつけるべき。 (ちなみにスーパークラスに同じ名前のメソッドがあることに気付かずメソッド名衝突する問題はJava5から登場した@Overrideアノテーションで回避できる) 自分のクラスのメソッドを呼びたいときはできるかぎりthisをつけるべき。インスタンスメソッドはできるかぎりthis.メソッド名() staticなメソッドはthisつけないでクラス名.メソッド名()とするのが望ましい。Checkstyleとか使ってコーディング規約を守るなら。 そもそもthis.superとかsuper.thisなんて記述ではコンパイル通らない。
138 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 03:58:36 ] 詳しい説明ありがとうございます
139 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:03:05 ] となると、変数や定数のフィールドもsuperやthisをつけて使ったほうがよさそうですね・・・ 今後気をつけます
140 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:14:16 ] 仮に>>130 の例で
141 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:17:57 ] 仮に>>130 の例で ClassBでhoge()をオーバーライドしたとき 他のクラスからClassBのインスタンスからスーパークラスであるClassAのhoge()を呼び出すってことできます? 例えば class ClassB extends ClassA { void hoge() { System.out.println("Hoge Override"); } } class ClassC { void nanika() { ClassB b=new ClassB(); b.hoge(); //←ここでClassBのhoge()じゃなくてスーパークラスのほうのhoge()を呼び出すことって出来ますか? } }
142 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:23:30 ] できないしできたらおかしい
143 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 04:25:43 ] class ClassC { void nanika() { ClassB b=new ClassB(); ClassA a=(ClassA)b; a.hoge(); //←もしかして、こうしたらスーパークラスのほうのhoge()になりますか? b.super.hoge();とかありそうな気もします } }
144 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 11:42:54 ] >>94 Javaでは無理ですね。1ファイル中に登場するクラスの単純名が重複している場合は そのうち1つだけしか単純名で扱えず、それ以外はFQNで書く必要があります。 Groovy(Scalaも?)は別名をつけられるので、上記のようなJavaの煩わしさは 軽減できるようですが。
145 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 13:29:43 ] >>141 できない。 >>143 できない。ためしにコンパイルしようとすればわかる。 どうしてもそんなことしたかったら ClassA a = new ClassA(); a.hoge(); こうする。 bを(ClassA)にキャストしても中身はこれと同じだからオーバーライドしたメソッドしか呼び出されない。 ClassA a = new ClassB(); というかいい加減に自分でコンパイルして自分の目で確かめろと。
146 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 14:04:49 ] >>142 ,145 回答ありがとうございます。 出来ないのですか・・・となるとどちらも使いたい場合は 何とかメソッド名を変えるなり対応するしかなさそうですね・・・ わかりました
147 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 14:59:25 ] >>146 マジレスすると設計がおかしい
148 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 18:42:54 ] >>146 デザインパターンの勉強をすべき
149 名前:114 mailto:sage [2010/05/06(木) 19:48:50 ] >>117 機種依存部分に対してなんかするんだったか、 jar内のjava部分に対してなんかするんだったか、 自分が書いたコードに対してなんかするんだったかだけでも思い出せませんか? いすれにしても素敵なヒントありがとうございました。
150 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 19:51:29 ] >>149 罫線がSJISとかだと半角カタカナの領域できめうちだったりしたような。
151 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 21:37:13 ] Java6からQueueが追加されたっていうんで調べてみたら LinkedListがQueueを実装してpop()が使えるようになってた。 早速使ってみたが private List<String> list = new LinkedList<String>() this.list.add("test"); this.list.add("abc"); this.list.add("def"); String result = list.pop(); という使い方はさすがにできなかった。 pop()はQueueで定義されListで定義されてないため。 private Queue<String> list = new LinkedList<String>() とやりたかったがLinkedList#listIterator()を使いたかったために 仕方なく private LinkedList<String> list = new LinkedList<String>() ってやった。 なんだかな。
152 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 21:39:35 ] おまえはコンクリートクラスをベタ書きで使ってるのがお似合い。
153 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 21:41:53 ] >>151 意味が分からない俺は初心者です。ハイ。
154 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 22:02:30 ] >>151 まさにLinkedListの性質が必要となっているので、 インタフェースを指定する必要はない。 ところで、<E, T extends List<E> & Deque<E>> とか&指定する機会ってあんまりないよねー。
155 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 22:47:47 ] >>151 意味がわからん。 なんでqueue使うのにlistIteratorが要るんだ? だいたいLinkedListじゃなくてArrayDequeue使うところだろ。 listIterator使うってことはカーソル基準の相対位置にアクセスしたいのか? pop要らんしpopしたら意味が変わってくるだろ。
156 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 22:50:34 ] ところでリスト更新したらConcurrentModificationでない?
157 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 23:40:44 ] >>155 というかさ、LinkedListだとしても普通に Queue<String> queue = new LinkedList<String>(); queue.add("1"); queue.add("2"); queue.add("3"); String elm; while((elm = queue.poll()) != null ){ System.out.println(elm); } だと思うんだ。
158 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 23:53:08 ] >>151 Queue<String> q = new LinkedList<String>(); q.add("test"); q.add("abc"); q.add("def"); Iterator<String> i = q.iterator(); while (i.hasNext()) { System.out.println(i.next()); } System.out.println("-----"); String s; while ((s=q.poll())!=null) { System.out.println(s); } とかはダメなのか?ListIteratorしか使えない呪いでも?
159 名前:157 mailto:sage [2010/05/07(金) 00:00:16 ] >>158 Iterator<String> i = q.iterator(); while (i.hasNext()) { System.out.println(i.next()); } の部分は、 for(String s : queue){ System.out.println(s); } の方がスッキリして好きだな。
160 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 00:04:30 ] 前の LinkedList 厨だからスルーが吉
161 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 05:38:23 ] え?厨?
162 名前:デフォルトの名無しさん [2010/05/07(金) 09:04:58 ] 初心者です。試験勉強用の事で、言葉の定義とかなんですが、質問させて下さい。 1)メソッドに渡した基本型のフィールド変数は、メソッド内側の操作は、 外側の変数には反映されないでしょうか。(合っていますよね。) 2)このメソッド内の変数をローカル変数と呼ぶ、合っていますか。 3)通常、引数で渡した変数の反映を読んだ側でも反映して返すには、 戻り値で返すのが普通でしょうか。(static変数との使い分けがよく分からない;) 4)メソッドに参照型の参照で渡した場合、 メソッド内部のインスタンスに対する操作は反映される、っていうのが、 当たり前だと個人的には感じるんだけども、 わざわざ参考書とかで説明してあるのが謎です。 例えば、 method1(Vector v)の中で Vector v = new Vector(); v.add(new String("abc"); とやった場合には外側のvにはabcはくっつかない、 method2(Vector v)の中で v.add(new String("abc"); とかやると、くっつく、と。 当たり前の様な気もしますし、どうなんでしょう。 5)この4)の場合と、1)の場合を比較した時の理論がよくわかりません。 1)だと、メソッド側に引数で渡された基本型の値はコピーされて (多分JVMのメモリにはその値用の領域が確保されますよね) メソッド内の操作はそのコピーされた領域に保存された値を操作しているんだと 思いますが、4)で参照を渡した時も、参照は別の領域にコピーされるんですよね。 すると、4−method2の場合には、v.add〜のvで指せる参照はコピーされた 値な様な気がして・・どうなんでしょうか。
163 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 09:25:20 ] >>162 1:反映されません。というよりは、関数内の変数に値がコピーされます。 2:ローカル変数と読んでもいいです。パラメータって普通言うけど。 3:staticは基本的に何度も値を書き込むのに使わないでください。 基本的に定数に使うものです。 返り(戻り)値で済むなら返り値を使ってください。 返り値で済まないなら、状態を持つクラスのインスタンスを渡して、 それに対してメソッド内部で操作を行います。 void method(VOClass vo){ vo.setXXXX("hogehoge"); } クラスを作るのが面倒な時は配列で渡します。 あんまりやらないほうがいいですが。 void method(Object[] o){ o[0] = "hogehoge"; } 4.どうなんでしょう?っていわれてもね、参考書は初学者のためのものだからね。 でもオブジェクトの値渡しするような言語(C++)は、普通に引数にモノを渡すと 一般的にはオブジェクトがコピーされるんで、その理論は通用しません。 どうでもいいですが、Stringのコンストラクタは意味がないどころか 普通はコスト的に有害なので超特別な理由がない限り呼ばないでください。 あとVectorじゃなくて普通はArrayListを使います。 5.Javaには参照渡しはありません。メソッドのオブジェクトを渡した時は、 オブジェクトへの参照がコピられて値渡しされてるだけ。 オブジェクト以外の基本型(プリミティヴ)を 渡した時もその値がコピられて値渡しされてるだけ。 method2はmethod2に渡した引数(オブジェクト)の参照がコピられて method2のvパラメータに設定されているだけ。 参照ってのは32bitのメモリ空間を表す数字ね。
164 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 09:41:37 ] >>163 >staticは基本的に何度も値を書き込むのに使わないでください。 >基本的に定数に使うものです。 定数のときはstatic final クラス内で共通、唯一つな時に使えばいいのであって何度も値を書いて問題なし FPSでの弾の数とか
165 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 10:41:33 ] >>164 弾の数… ビミョー。使っちゃダメってことはないけど、 あんまり正当化できるシーンは少ない。 少なくともstatic変数が現れたら「きちんと使っているかどうか」 ってのは見てしまうね。コードレビューの時とか。 だいたい「使う正当な理由はないよね。じゃやめて。」 って注意して終わる。
166 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:41:40 ] javaの公式サイトにここ数日まったく繋がらないんですが・・・
167 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:51:15 ] >>166 java.sun.com/ 普通にこのサイトにつながるけど
168 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 18:49:58 ] >>155 それArrayDequeueじゃなくてArrayDeque javadocにも書いてある通りdequeとdequeueでは英語的にもまったく意味が違う 話を戻して、Listに入れたい要素のオブジェクトを作るクラスを独自に作って 前後関係をもたせたので結局Iteratorを使う必要がなくなってしまった。 Chain of Responsibilityのたらい回しを参考に、となりどうしのオブジェクトがお互い参照しあう方式をとることにした。 それとは別にこういうデータ構造が必要だった。 ・基本的に、Stackのように端からしかデータを取得除去する必要がないからpop()を使う。 ・ひたすら端からデータを取るだけ。 ・要素が空になったときのみ一気に補充する。 ・感覚としては弾薬の再装填や燃料補給に近い。しかし個々の要素はまったく異なるものを含み重複を許可する。 だから削除速度が速いらしいLinkedListにした。 Dequeによるとpoll()はpollFirst()と同じ。 pop()はremoveFirst()同じ。 removeFirst()は空のときNoSushElementExceptionをthrowするpollFirst()。空のときはnullを返す。 (isEmpty()を使えば例外は気にしなくていい) みたいだったがnullで判定するのが好きな人が多いね。
169 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 18:55:45 ] >>165 > >>164 > 弾の数… ビミョー。使っちゃダメってことはないけど、 > あんまり正当化できるシーンは少ない。 > 少なくともstatic変数が現れたら「きちんと使っているかどうか」 > ってのは見てしまうね。コードレビューの時とか。 > だいたい「使う正当な理由はないよね。じゃやめて。」 > って注意して終わる。 複数のインスタンスでひとつの状態を共有するときはstatic変数は重宝する。
170 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 19:28:14 ] だから"ビミョー"なんじゃないの?
171 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 20:00:11 ] 書籍『Java言語仕様』によると、純粋主義者はインスタンスフィールドはすべてprivateにすべき staticフィールドはfinalにすべきというが、そんな感じの意見か。 staticなフィールドの代替をCollectionを集約したSlngletonで代用するとかいう感じか。
172 名前:デフォルトの名無しさん [2010/05/07(金) 21:51:12 ] 入力するときに、import java.io.* とimport java.io.* って何が違うの? JAVA初めて即効分からなくなった。 どっちのがいいとかある? IOで解説してるサイトが多いからそっちのが簡単とか?
173 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 21:52:56 ] 間違えた。 java.util.
174 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 21:55:27 ] ( ゚Д゚)ポカーン
175 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:01:12 ] イギリスとフランスって何が違うの?級の質問
176 名前:デフォルトの名無しさん [2010/05/07(金) 22:09:21 ] そうなんですか。 ではテキスト通りutilにします。 有難うございました。
177 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:23:00 ] test
178 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:28:00 ] 質問させてください。 現在コンソール入力でヒットアンドブロー(数字当て)のゲームを開発中で詰まっている点があります。 まず、プログラム上で乱数にて4桁の数字をセットします。 コンソール画面上の例 : ▲回目:1234 ⇒ Hit :● Blow :● ※▲には入力の回数カウンタを表示。 ※●には入力した数字に対して正否の数字がそれぞれ入る。 @『 ▲回目: 』 と表示させた後、ユーザーが入力で4桁の数字を入力してEnterを押す。 ABufferedReaderクラスのInputStreamReaderメソッドにてSystem.Inを入力し変換させ表示 B正否判定を表示 『 ⇒ Hit :● Blow :● 』 このAとBの間で、改行させずに入力を行いたいのですがうまくいきません。 改行はBの正否の判定を表示した時にSystem.out.printlnでするだけにしたいんです。 以下のような形での画面・入力仕様が目標です。 1回目:1234 ⇒ Hit :0 Blow :4 2回目:2525 ⇒ Hit :2 Blow :2 1回目:7777 ⇒ Hit :4 Blow :0 Congratulation・・・
179 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:29:48 ] >>178 どうせBufferedReaderでreadlineとかしてんでしょ。
180 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:32:18 ] >>179 はい、その通りです。
181 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:36:19 ] >>168 おれなら、 public class Test { public static void main(String[] args) { Deque<String> queue = new ReloadableDeque<String>() { @Override public void reload() { System.out.println("リロードっ"); this.add("1"); this.add("2"); this.add("3"); } }; String elm; while ((elm = queue.pollFirst())!=null) System.out.println(elm); } } public abstract class ReloadableDeque<E> extends ArrayDeque<E> implements Reloadable{ @Override public E pollFirst() { E elm; if ((elm = super.pollFirst()) == null) { reload(); elm = super.pollFirst(); } return elm; } } public interface Reloadable { void reload(); } だな。
182 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:39:38 ] >>180 readlineは一行分読み込みが終わるまで読み込めない。 ファイルが読み込み元なら改行文字にブチ当たるまで読み込めない。 コンソールが読み込み元なら改行してくれるまで読み込めない。 別の読み込みメソッドを使いましょう。
183 名前:182 mailto:sage [2010/05/07(金) 22:43:17 ] と思ったけど、無理だな