【初心者】Java質問・相談スレッド93【大歓迎】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/22(日) 13:42:10質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
前スレッド
【初心者】Java質問・相談スレッド92【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1159700963/
/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/
次スレは>>980あたりで。
0369ぴゅあ
2006/11/02(木) 19:57:38>>166の話と同じ
ところで…
書いてある範囲に限定した話で
>もう一個のプログラムで
>soc = new Socket("localhost",****)
って関係ないから・・・
>この程度ならセキュリティも何もないんですかね?
がどっちの意味を指して言っているのか判らないけど…
・セキュリティ度外視状態
・セキュリティ無関係状態
あとはレスしてくれた人たちのを理解すればいいだろうから省略
0370ぴゅあ
2006/11/02(木) 20:02:32APIリファレンスでマウス周りのクラスを一通り見てみるつもりでも見れば
きちんと説明されてるみたいですよ
(>>362が解説してくれたところまでもが)
0371デフォルトの名無しさん
2006/11/02(木) 20:38:05基本データ型以外の変数は全て参照型ということで納得していたのですが、
String a = "aaa";
String b = "aaa";
でa==bがtrueになったり、
b = a.substring(1);
だとa==bがfalseで
b = a.substring(0);
だとa==bがtrueだったりするのが不自然に思えました。
これは書き換えを行わないという前提のStringクラスだけの特別な仕様で
一つの文字列につき一つのStringインスタンスしか作らないような仕組みになってるんですか?
0372デフォルトの名無しさん
2006/11/02(木) 20:52:07Yes.
だだしnew String("aaa")すると新しくStringが生成される
0373371
2006/11/02(木) 21:22:460374ぴゅあ
2006/11/02(木) 21:39:52でもまだ微妙かも?
"=="は文字列"aaa"を見てるんじゃないよ
というのとかをまず理解できた方がいいんじゃないかと思う
(>>371に対しては長くなったので割愛しました@色々やれば色々と判ってくると思うし)
0375デフォルトの名無しさん
2006/11/02(木) 21:50:47質問なのですが、DoJa 4.0以降でAACもしくはPCMは再生できるのでしょうか。
ADPCMもDoJa 4.0世代での対応周波数が分からないので…。
よろしくお願いします。
0376ぴゅあ
2006/11/02(木) 22:04:48あ いや…
Stringオブジェクトについて見ようとしていたのかも知れないし
"aaa"の方かな。。。
結局はStringと"=="の話に到達してそうな気もするけど…
0377デフォルトの名無しさん
2006/11/02(木) 22:41:09>>369
どうもありがとうございます
0378デフォルトの名無しさん
2006/11/03(金) 03:17:00必ずそうなる訳ではないので、内容比較はequals使いましょう
Integerとかも、場合によってはインスタンス使い回すし。
不変オブジェクトはそういうインスタンス使い回しがよくされる。
でも、それは実装依存だからね。
0379371
2006/11/03(金) 04:57:09内容比較にならないのはわかっていたんです。
"hoge".instanceMethod()という構文ができるということは
文字列リテラルを書いただけでインスタンスが作成されていて、
更に>>371の二回目の"aaa"では新たに作成せずに
自動的に一回目と同じインスタンスになっているんですよね。
そのあたりのJavaの挙動が不思議だったんです。
ところで>>378のような文脈での「実装」という言葉の定義がよくわからないのですが、
ソースから処理実行までの過程のどの部分のどういった差異の事を指すんですか?
0380デフォルトの名無しさん
2006/11/03(金) 05:49:36メディエータだろ。
0381デフォルトの名無しさん
2006/11/03(金) 05:59:53C/C++でも静的文字列は使いまわされる実装が多い気がするが
Javaでは文字列リテラルはVMだかクラスローダだかで一意の
Stringオブジェクトになることが仕様で決まっている。
(たとえ複数のクラスにまたがって書いてあったとしても!)
なおJavaに限らず仕様で決まっていないことは *すべて* 実装依存だ。
0382デフォルトの名無しさん
2006/11/03(金) 07:09:38>ところで>>378のような文脈での「実装」という言葉の定義がよくわからないのですが
VM とか java.lang.* みたいなVMに直結したライブラリの実装。
というより、言語規定で明確に決められていないって事かな?
>>371 に関して言えば、言語規定で決められてないって意味では
"aaa" == "aaa".substring(0) が true になった事ぐらいのような気もするけど。
0383デフォルトの名無しさん
2006/11/03(金) 13:40:29これらはCopyメソッドと比べて何が違うのでしょうか?
どちらもオブジェクトの情報を複製するのが目的だと思うのですが、
どのように使い分けるのでしょうか?
BufferedReader br= new BufferedReader(fr);
FileReaderとBufferedReaderの違いがよくわからないのですが
具体的に何をどう読み込んでるか教えてくだしあ><
0385デフォルトの名無しさん
2006/11/03(金) 13:47:24Copyメソッドって何だ?
それから、大文字小文字は区別しろ。
0386デフォルトの名無しさん
2006/11/03(金) 13:58:38配列を複製する時に使用するのが、copyメソッドらしいのですが
配列以外では使えないのか、cloneメソッドでは複製出来ないのかな、と。
また、Clonableインターフェイスを絡めて他のクラスからの情報を複製する場合、
どのような感じでコードを書けば良いかが分かりません。
ご指摘ありがとうございます。今後、気をつけます。>大文字小文字は区別しろ。
0387デフォルトの名無しさん
2006/11/03(金) 15:03:24配列でも clone() 使えるぞ。 それに配列に copy() なんてメソッド無いぞ。
java.lang.System#arraycopy(Object,int,Object,int,int) の事を言ってるのかもしれんが、
あれは複製じゃなくて内容を書き写すメソッドだからなぁ。
0388デフォルトの名無しさん
2006/11/03(金) 15:11:520389デフォルトの名無しさん
2006/11/03(金) 15:17:09たぶん一生直らないと思う。
0390デフォルトの名無しさん
2006/11/03(金) 15:22:02> FileReaderとBufferedReaderの違いがよくわからないのですが
BufferedReader は readLine() が使える。
FileReader は一文字読み込みの read() やらを連発すると、
実行速度が著しく低下する可能性がある。
0391デフォルトの名無しさん
2006/11/03(金) 15:23:33where句が動的に変わるSQLでPreparedStatementを使用すると、
PreparedStatement#setXXX メソッドを呼び出すときに
同じような条件判定を書かなきゃいけなくなります。
なんかうまく書く方法ってないでしょうか?
// where句の編集
if (joken1 != null) {
whereSql = whereSql + "joken1 = ?";
}
if (joken2 != null) {
whereSql = whereSql + "joken2 = ?";
}
if (joken3 != null) {
whereSql = whereSql + "joken3 = ?";
}
PreparedStatement ps = conn.prepareStatement(sql + whereSql);
// プレースホルダへ検索条件設定
if (joken1 != null) {
ps.setString(index++, joken1);
}
if (joken2 != null) {
ps.setString(index++, joken2);
}
if (joken3 != null) {
ps.setString(index++, joken3);
}
0392デフォルトの名無しさん
2006/11/03(金) 15:49:02List paramList = new ArrayList();
if (joken1 != null) {
whereSql = whereSql + "joken1 = ?";
paramList.add(joken1);
}
// 中略
PreparedStatement ps = conn.prepareStatement(sql + whereSql);
int index = 0;
for(Iterator paramItr = paramList.iterator; paramItr.hasNext(); ){
ps.setObject(++index; paramItr.next());
}
0393デフォルトの名無しさん
2006/11/03(金) 15:53:45レスありがとうございます。
という事は教本等にある、シャローコピー、ディープコピーとは何に当たるのでしょうか?
cloneableインターフェイスとcloneメソッドですが、「オブジェクトの複製」をする為にあると
思って間違いはないでしょうか?例えば、
public class Data implements Cloneable {
int x;
if (this instanceof Cloneable){
Data d = new Data(何かしらのデータ);
for(int i = 0; i<this.size; i++){
d.x = this.x;
return x;
} else{
throw CloneNotSupportedException;
}
こんな感じで良いのでしょうか?
0394デフォルトの名無しさん
2006/11/03(金) 16:02:15Bug ID: 1234712 Cloneable is misspelled を参照。
0395デフォルトの名無しさん
2006/11/03(金) 16:10:55> シャローコピー、ディープコピーとは何に当たるのでしょうか?
例えば、こんな配列があったとして
int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
シャローコピーは 1階層しかコピーしない、浅いコピー。
int[][] shallow = new int[array.length][];
for(int i = 0; i < array.length ; i++) shallow[i] = array[i];
ディープコピーは、全階層を辿ってコピーする。
int[][] deep = new int[array.length][];
for(int i = 0; i < array.length ; i++){
deep[i] = new int[array[i].length];
for(int j = 0; j < array[i].length; j++) deep[i][j] = array[i][j];
}
シャローコピーでは、src[0][0] = 2; とかやると、shallow にも影響が及ぶ。
ディープコピーでは影響が及ばない代わりに、コピーのコストが高い。
0396デフォルトの名無しさん
2006/11/03(金) 16:25:38public Object clone() メソッドを実装しろ。それだと Cloneable である意味が全然ない。
clone メソッドの中でコピーをする方法を書くんだ。
シャローコピーでいいなら super.clone() を呼ぶだけでよい。
0397ぴゅあ
2006/11/03(金) 19:21:29"うまく"というのか、"選択"?だろうけど
1.まずその付近全体のコードを整える
2.コード全体を眺めメソッド等に抽出できるものはないか挙げてみる
>whereSql = whereSql + "joken1 = ?";
なんて"StringBuffer使えよ"とか言われてしまいそうなところから
全体を書き替えてみると何か気付くこともあるのかも知れないし
(その前の部分のコードもあるのだろうけど、
そっちはベタでそのまま文字列になってるのかもだけど)
使い捨てでもなく、ちゃんと管理できると思えるなら
StringBuilderならぬSqlBuilderみたいな形に
作ってみたりもできそうだけど
(その前にその手のものなら探せばありそうな気も…
質問部分には答えてくれないかもだけど)
読み込む中身はファイルの文章全体であることは同じなのですか?
0399デフォルトの名無しさん
2006/11/03(金) 19:51:51> 読み込む中身はファイルの文章全体であることは同じなのですか?
基本的に同じ。
BufferedReader の readLine() を使った場合だけ、
その行の終端にある改行文字が削除される。
0400ぴゅあ
2006/11/03(金) 22:16:51FileReaderとBufferedReaderを対等に並べて比較できるか…?
というのもありそうな気もしたりですけど
(ザックリ)
・ファイル → FileReader
や
・ファイル → FileReader → BufferedReader
は、あっても
・ファイル → BufferedReader
はないですよね?
或いは"ファイル → FileReader"の代わりに
・ソケット(InputStream) → InputStreamReader → BufferedReader
とか
(FileReaderはInputStreamReaderをファイルを扱うのに特化したもの)
FileReaderやInputStreamReaderの段階で取り出す場合と
BufferedReader(Reader + Buffer…StringBuffer的?)の段階で取り出す場合とで
それぞれの段階で取り出せる形がどう違うのかとか調べてみるといいのかも
或いはFileReaderとBufferedReaderとの間で区切って考えてみるとか
探せば、これらの流れを漫画にして解説してくれているのも多数ある筈です
たぶんそれらによって
>読み込む中身はファイルの文章全体であることは同じなのですか?
とかいう疑問は解消されるのかも?
或いはその上で>>399の話を読み直してみるとか
0401デフォルトの名無しさん
2006/11/04(土) 00:08:460402デフォルトの名無しさん
2006/11/04(土) 00:16:03Fieldそのものはprivateでも取り出せるから
あとは無理矢理アクセス権を作ってしまえばいい。
0403デフォルトの名無しさん
2006/11/04(土) 00:24:52ありがとうございます。リフレクションのこと調べてみます。
ゲッター書かないで保存してしまってすごく困ってました(´Д`;)ヾ
0404デフォルトの名無しさん
2006/11/04(土) 00:29:45アプリケーションを起動したときにはきちんと表示されるのですが、
他のウィンドウが重なったり、最小化させたあとに
もう一度そのウィンドウを開くと、
画像が表示されなくなってしまいます。
きちんと表示させるためには何が必要なのでしょうか?
よろしくお願いします。
0405デフォルトの名無しさん
2006/11/04(土) 07:45:29特に必要なことはないはずだけど。
ImageIconとかの既存のIconでなく自分で実装したIconで再描画に対応できない造りになっているとか。
状況を再現できる最小限のソースがあれば指摘できる人が増えると思う。
0406ぴゅあ
2006/11/04(土) 11:44:35>他のウィンドウが重なったり、最小化させたあとに
>もう一度そのウィンドウを開くと、
>画像が表示されなくなってしまいます。
と言われると、
(Javaとか関係なく)再描画ができていない…paint/repaint周りとかを
オーバーライドして何かやってる?(何か必要なことを落としている)
とかが浮かぶのですけど・・・
>jLabelにsetIconを使ってgif画像を貼り付けています。
だけなら、>>405の言っているように特にないだろうと思うけど
0407デフォルトの名無しさん
2006/11/04(土) 12:51:44>>405
レスありがとうございます。
jPanel -- jLabel1
-- jLabel2
という構造で、jLabel1に前述の画像表示、
jLabel2ではpaint周りをオーバーライドしています。
jLabel1の方にまでjLabel2のオーバーライドの影響が及ぶものなのでしょうか?
影響がなければ、javaでなくPC環境のせいなのかもしれないのですね。
0408デフォルトの名無しさん
2006/11/04(土) 13:22:04> jLabel2ではpaint周りをオーバーライドしています。
これの所為だな。
0409ぴゅあ
2006/11/04(土) 14:12:31>jLabel1の方にまでjLabel2のオーバーライドの影響が及ぶものなのでしょうか?
は、ないだろうと思ったりはしますけど
(jLabel1はJLabelそのものをそのまま使っているということだと解釈するけど)
JPanelとか、JPanelを乗せているものとか...(更に…)には
オーバーライドとかやっていることはないんでしょうか
>>405も言っている再現される最低限のソースが用意できるなら
判りやすいでしょうね
(jLabel1とかjLabel2とか、なんか話に微妙なもの?がありそうな気もしたりするし…)
0410デフォルトの名無しさん
2006/11/04(土) 16:09:10swingの場合は paintではなくpaintComponentをオーバーライドする。
public void paintComponent(Graphics g) {
super.paintComponent(g);
//paintする処理を記述
}
0411デフォルトの名無しさん
2006/11/04(土) 16:41:02見ても何も書いていなかったので私のミスかな・・
Truth.java:3: シンボルを解決できません。
シンボル: クラス string
場所 : Truth の クラス
string right = "正解",wrong = "不正解";
^
Truth.java:7: シンボルを解決できません。
シンボル: クラス string
場所 : Truth の クラス
string right = value ? right : wrong;
^
エラー 2 個
class Truth{
public static void main(String[] args){
string right = "正解",wrong = "不正解";
boolean value;
value = true;
string answer = value ? right : wrong;
System.out.println(answer);
value = false;
answer = value ? right : wrong;
System.out.println(answer);
}
}
0412デフォルトの名無しさん
2006/11/04(土) 16:47:39だとしたら、教材のミスだ。
0414デフォルトの名無しさん
2006/11/04(土) 17:43:40VBとかは識別しないから、このへんから来た人は注意ね
0415デフォルトの名無しさん
2006/11/04(土) 18:15:03>>346
>>343を書いたんだけど、確かにソースコード書けだけではなく、文書化されている
モノも示すべきだと痛感。実際Effective Java持っているし、Java SEのAPI,,Tomcatなど
ソースコードをみてStringクラスやクラスローダの仕組み勉強したので。。。
Effective Javaより初心者向きでは、「日経BP SunJava2認定ガイド」がお勧めだと思う。
Sunの資格取るための教科書だけど、Objectクラスを継承するノウハウやequalsメソッド
などを、一般的な入門書より深く書いてある。
0416デフォルトの名無しさん
2006/11/04(土) 18:43:28だってそういう試験だしw
0418デフォルトの名無しさん
2006/11/04(土) 19:23:34下の例のようにBufferedReaderクラスのreadLineメソッドを使って行単位で読み込むというやり方がいろんなサイトで紹介されてますが、
ループを使わずにファイルの中身全部を一括して読み込むことってできないのでしょうか?
BufferedReader br = new BufferedReader(in);
StringBuilder s;
String line;
while ((line = br.readLine()) != null) {
s.append(line);
}
それともう一点。
下のようにStringオブジェクトの初期化の時に、文字列が長いと改行して +で連結する書き方をよくするのですが、
これって、コンパイル時に"abc・・・" + "xyz"は"abc・・・xyz"として最適化されるのでしょうか?
というのも、実行時に String型オブジェクト"abc・・・"と"xyz"が生成されて、String型オブジェクト"abc・・・xyz"を生成し直して、参照変数sにセットしているというような流れになっていないのかなっと思いまして。。
String s = "abc・・・"
+ "xyz";
0419デフォルトの名無しさん
2006/11/04(土) 19:28:44ちょっとお伺いしたいのですが、JSPで、セッションでのパラメーターの受け渡しが上手くいきません。
教えてもらえないでしょうか。
このページから、
http://www.wikiroom.com/java/index.php?plugin=attach&pcmd=open&file=Customer.jsp&refer=JSP%20session
このページへ、受け渡しをしたいのです。現在だと、すべて、NULLが表示されます。
http://www.wikiroom.com/java/index.php?plugin=attach&pcmd=open&file=ShipSummary.jsp&refer=JSP%20session
よろしくお願いします。
0420ぴゅあ
2006/11/04(土) 19:44:41>ループを使わずにファイルの中身全部を一括して読み込むことってできないのでしょうか?
BufferedReader#readLine()のようにというところではないんだろうと思う
テキストファイルだとしても、何十MBとかあるファイルを一度に読み込んじゃあ大変だろうし
一度に読み込んでおかないとできない処理なんてのもそうそうないんじゃないでしょうか
いや、でも読み込みたいんだということであれば
InputStreamReader#read(...)とかで一気に読んでおくとかあるでしょうけど
ホントにそれでいいのか、よく検討してみた方がいいような気がする。。。
>下のようにStringオブジェクトの初期化の時に
よく知らないんですけど、
逆コンパイラではなくて逆アセンブラみたいなツール?があるらしいのですが
それで実際にどうコンパイル(最適化)されているのか見てみるといいんじゃないかと
(バージョンによってまた違うとかもあるでしょうけど、見ておくのは安心?なのかも)
0421デフォルトの名無しさん
2006/11/04(土) 19:51:20Decoder#decodeって速くないから意味無いと気づく。
あえてnio使うなら改行表現を勝手に修正されたくない場合とかかな。
0422ぴゅあ
2006/11/04(土) 19:58:04JSPはずっと触ってないのであまり突っ込めないと思うけど
遷移先のページでsessionて出てきてる?
というような気がする・・・
0423デフォルトの名無しさん
2006/11/04(土) 20:15:20書き換えるの忘れてました。request.getAttributeってやってました。
なんて、馬鹿なんだろう。
ありがとうございました。
0424418
2006/11/04(土) 20:32:56ありがとうございます。
htmlファイルを読み込んで正規表現かけて欲しい情報を一発で取得したいがために
一括読み込みを考えてました。nioというキーワードをいただいたので少し調べてみます。
>逆コンパイラではなくて逆アセンブラみたいなツール?があるらしいのですが
なるほどです。失念してました><
早速jadを使って逆コンパイルしてみたら、String s = "abc・・・xyz";に置き換わってました。
0425デフォルトの名無しさん
2006/11/04(土) 20:44:30質問させていただきたいのですが、DBサーバを再起動すると
Websphereが持っているDB接続情報(コネクションプール)が変わってしまい
Websphereの方も再起動しないとDBに接続できなくなってしまうのですが
これはそういうものなのでしょうか?
それとも設定をいじれば、Websphereまで再起動する必要はないのでしょうか?
Websphereまでも再起動するというのが嫌なので改善方法があれば教えてください。
0426ぴゅあ
2006/11/04(土) 20:49:15jadでもそこは見れるんですね
よくは知らないんですけど、アセンブラコード風のリストが
見れるようなものがあるらしいようでもあるのですけど
(もしかしたらString s = "abc";の"abc"がどう処理されているか
見えたりするのかな?とか思ってみたりするのですけど
そこまでは見えないのかな。。。)
>htmlファイルを読み込んで正規表現かけて欲しい情報を一発で取得したいがために
そんなに大きなファイルとなることもないんでしょうけど
読み込みつつ・・・なんて処理ができるといいんだろうと思いますけど
ただ、一気に読み込んでおくよりはめんどくさそうだという気はしますけどね
一度作れてしまえばその仕組みを色々活用できそうですけど
0427デフォルトの名無しさん
2006/11/04(土) 20:56:450428ぴゅあ
2006/11/04(土) 21:02:35昼頃見かけたあちらのスレッドからですよね
WebSphereも触らなくなって久しいですが
>DB接続情報(コネクションプール)
と言っているのがどの辺りを指しているのかよく判らなかったりしますけど
アプリということなら、作り方なのでしょうけど
"WebSphere コネクションプール DB 再起動"とかでググッてみると出てきそうですね
例えば以下のページとか?
http://www-1.ibm.com/support/docview.wss?uid=std3d370fa45fa339dc249257000002ad030
0429デフォルトの名無しさん
2006/11/04(土) 21:03:03XAデータソースを使っていたらそんなもん。
0430デフォルトの名無しさん
2006/11/04(土) 21:04:38swingであるボタンを押すとラベルが表示するように作りました。
しかし、ボタンを押すとそのラベルガ表示されません。
右上のwindowの拡大を押すと、全体のwindowが拡大されたあとに
ちゃんと表示されるのです。しかし、最初から拡大して押しても表示されないし、
縮小したままでも表示されません。ボタンをおす、拡大するの順番でやっと表示されるんです。
これはどうしてですか?
0431ぴゅあ
2006/11/04(土) 21:08:13ありがとう
以前チラと使って、あれ?とか思ったのも
再度やってみたら判った。。。(汗)
0432ぴゅあ
2006/11/04(土) 21:18:14ラベルを表示する部分のコードを示してみるとかするのがいいのかも
最大化でなくても、他のウィンドウを重ねたりとかすると表示されたりしないでしょうか
ラベルが…と言っているけど、JLabel#setText()とか呼んでいたりしているんではなくて
或いはrepaint()とかrevalidate()とかが呼ばれないようなものになっているとか
最大化することによって再描画される状態になるのでやっと表示されるという状態が
起きていたりするんじゃないだろうかと思えたりですけど
0433デフォルトの名無しさん
2006/11/04(土) 21:33:10public にするのと、 package private にするのと、どちらがいいんでしょうか?
クラスと同様に package private にしとくと、 package private な interface を作って実装したときに
そこだけ public にしなきゃならなくなって、 public と package private とが混在して違和感があります。
かといって全部 public にしておいても、 package 外からはアクセスできないんだし、やっぱり違和感があります。
jdkのソースとか見るとコンストラクタだけ package private にして、メソッドは全部 public ってのが
多いみたいだったので、現在はそうしてます。
元を正せば package private な interface のメソッドは暗黙的に package private なアクセスレベルで
あるべきと思うんですが。
みなさん、どのようにしていますか?
0434デフォルトの名無しさん
2006/11/05(日) 00:02:10ArrayList<Integer> a = new ArrayList<Integer>()
a.add(1);
a.add(2);
int[] b = new int[a.size()];
for(int i=0;i<a.size();i++){
b[i]=a.get(i);
}
これを、toArray()を用いて書くにはどうしたらいいのでしょうか?
Integerとintの変換がうまくいかずエラーがでてしまいます。
0435デフォルトの名無しさん
2006/11/05(日) 00:07:55あなた自身の書いたそのコードがベストプラクティスに見えるけど。
0436デフォルトの名無しさん
2006/11/05(日) 00:25:24Object[] toArray(Object[] a) という関数を用いて
b=a.toArray(new Integer[a.size()]);
のように1行で書けるならそっちのほうがよりよいのかなと思ったのですが、
Integer[] → int[] へのキャストがわからずエラーがでてしまいます。
>>434のようにforで書いた方がよさげですか?
0437デフォルトの名無しさん
2006/11/05(日) 00:32:300438ぴゅあ
2006/11/05(日) 00:40:05>ArrayList<Integer> a = new ArrayList<Integer>();
からArrayList#toArray()で取れるのはInteger[]まで
a.get(i)はIntegerで取れているけど
>b[i]=a.get(i);
はアンボクシングが働いているので、正確にはb[i]=a.get(i).intValue();
get()までしか扱えないので
>Integer[] → int[] へのキャストがわからずエラーがでてしまいます。
という見方もできたりするでしょう
(正しくは(?)toArray()はArrayList<Integer>をInteger[]にするまでしかしないので)
commons Langまで持ち出して
Integer[] tmp = a.toArray(new Integer[a.size()]);
int[] b = ArrayUtils.toPrimitive(tmp);
とかも考えられなくはないでしょうけど
>>435の言ってることの方がいいだろうと思います
(2回配列を作ることになるし、余計なチェックコードとかも増えることにもなる@ArrayList#toArray(),ArrayUtils#toPrimitive()内)
0439デフォルトの名無しさん
2006/11/05(日) 00:43:26なるほど、無理にやろうとしても逆に大変になるんですね
とても参考になりました、ありがとうざいますっ
0440ぴゅあ
2006/11/05(日) 00:43:48そうは言われても、何か手があるんではないか?と思うからでしょう
ベストと言われるところがまだ納得できていないからだろうと思う
0441ぴゅあ
2006/11/05(日) 01:28:35余計だろうけど、補足してみるなら
>Integer[] tmp = a.toArray(new Integer[a.size()]);
>int[] b = ArrayUtils.toPrimitive(tmp);
としてみてもtoArray()の分が無駄
a.get(i)はArrayListの中身elementData[i]を返す
ArrayUtils#toPrimitive()のやっているのは>>434のforループそのもの
a.get(i)の代わりに(>>438を例に)tmp[i]という感じ
ArrayUtils#toPrimitive()に渡すためにa.toArray(new Integer[a.size()])を呼んでも
(System#arraycopy()を使ったりして高速に)ベタコピーしているだけで
a.get(i)でelementData[i]を見れば済むところをにわざわざtmp[]にコピーして使う分要らぬことを…
コード量は多そうに見えるが、forループにした方がシンプルということに
毎回書くのが嫌ならメソッドに切り出すとかクラスを作ってしまうとか
そのときにはArrayListっぽい命名にはなってなかったりするのでしょうけどね
0442デフォルトの名無しさん
2006/11/05(日) 14:25:24WinCloseAdpt: http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28600
上記の例を実際に動作させ、インターフェースとアダプタクラスを比較し、考察せよ。
という問題が出されたのですが、
インターフェイスは、そのインターフェイスに抽象的に定義されている
すべてのメソッドをオーバーライドする必要がある。アダプタクラスは必要な
メソッドだけをオーバーライドするように簡略化が図られた。
ということ以外に何か書けることはありますでしょうか?
0443デフォルトの名無しさん
2006/11/05(日) 14:37:310444デフォルトの名無しさん
2006/11/05(日) 14:49:55たぶん、それで良いと思う。
後は、Frame を extends しつつインターフェイスを実装できるのに対して
Frame を extends しつつ、アダプタクラスも extends はできないので
別のクラスを作ってるという点が若干違うとか、そんぐらい。
0445デフォルトの名無しさん
2006/11/05(日) 14:59:49例えば、2つの引数(配列)を持つあるメソッドを作りたいときに、
引数にint型でもlong型でも両方使えるようにするには
static void cal(int[] a,int[] b){
処理;
}
static void cal(int[] a,long[] b){
処理;
}
static void cal(long[] a,int[] b){
処理;
}
static void cal(long[] a,long[] b){
処理;
}
のように4つ書くのは異常に面倒だと思うのですが、なにかうまい書き方ないものでしょうか?
0446デフォルトの名無しさん
2006/11/05(日) 15:09:39cal(toLongArray(a), toLongArray(b));
}
static void cal(int[] a, long[] b){
cal(toLongArray(a), b);
}
static void cal(long[] a, int[] b){
cal(a, toLongArray(b));
}
static void cal(long[] a,long[] b){
処理;
}
0447デフォルトの名無しさん
2006/11/05(日) 15:38:300448デフォルトの名無しさん
2006/11/05(日) 15:51:07なるほど、そうやって処理を一つにまとめればいいんですね
型変換による効率悪化 と 処理のコーディング楽さ どっちを取るかって感じですかね。
参考になりました、ありがとうございます。
0449デフォルトの名無しさん
2006/11/05(日) 16:28:390450デフォルトの名無しさん
2006/11/05(日) 16:36:23誘導っhttp://pc8.2ch.net/test/read.cgi/hp/1161422792/
0451デフォルトの名無しさん
2006/11/05(日) 16:49:18ありがとうございます〜
0452デフォルトの名無しさん
2006/11/05(日) 16:57:02リソースを開放すると出たのですが
開放とはどういった意味なのでしょうか?
0453デフォルトの名無しさん
2006/11/05(日) 17:02:17中身見たわけじゃないから何ともいえないけど
WindowsならHGCあたりを開放してんじゃないかな。
0454デフォルトの名無しさん
2006/11/05(日) 17:03:35gというオブジェクトが使っていたメモリその他の計算機資源を、
他のオブジェクト等で再利用できるようにするという意味。
その代わりdisposeするとgは使えなくなる。
0455デフォルトの名無しさん
2006/11/05(日) 17:07:02フルスクリーン表示して大きさ固定するにはどうすればいいでしょうか
setExtendedState(MAXIMIZED_BOTH);
setResizable(false);
ってやるとフルスクリーン化は解けてしまうし、
getMaximizedBounds()やgetBounds()は何故か0が返されてしまいます
0456デフォルトの名無しさん
2006/11/05(日) 17:20:33やりたいことはフルスクリーン化でなく最大化かな
setResizable(false);
setVisible(true);
setExtendedState(MAXIMIZED_BOTH);
の順序でやってみると?
0457デフォルトの名無しさん
2006/11/05(日) 17:23:28初期値というのはどうするのが良いのでしょうか。
ArrayListなどと違って負荷係数とかあるので最適値というのが良く分かりません。
0458デフォルトの名無しさん
2006/11/05(日) 17:25:20たとえば、状態AのときはAKeyListenerクラスを使って状態BのときはBKeyListenerクラスを使いたいんですが。
メインフレームでは
addKeyListener(new AKeyListener());
addKeyListener(new BKeyListener());
とやってますが状況に応じてどっちを使うか切り替えたいです。
0459デフォルトの名無しさん
2006/11/05(日) 17:34:52removeKeyListenerとaddKeyListenerで状況に応じて登録しなおすとか、
AKeyListenerとBKeyListenerの方で、それぞれ状態Aか状態Bのときにしか実際の処理をしないようにするとか。
0460デフォルトの名無しさん
2006/11/05(日) 17:39:58トン。removeKeyListenerを使う線で考えてみます。
0461ぴゅあ
2006/11/05(日) 17:49:58何も触らないのが最適値でもあるのかも?
何を基準に最適値を求めたいのか判らないですけど
APIリファレンスにはいちおよく読めば書かれていると思うけど
>>460
あちしは>>459の言う後者か
AKeyListenerなり(AKeyListenerのみ)で振り分けるとかの方が
いいんじゃないだろうかと思う
0462デフォルトの名無しさん
2006/11/05(日) 18:15:36その線も考えてみたんですが状態数が多くキー処理の数がものすごく多いのでなるべく分けておきたいなぁと。
AKeyListenerのメソッドがすごく長くなりそうなので。
↓みたいな感じにしてます。
public void setGameState(int gameState) {
// ゲーム状態を変更する
this.gameState = gameState;
// 現在のキーリスナーを削除
removeKeyListener(currentKeyListener);
// ゲーム状態に応じてキーリスナーをセット
switch (gameState) {
case GameState.TITLE :
addKeyListener(title);
currentKeyListener = title;
break;
case GameState.GAME :
addKeyListener(game);
currentKeyListener = game;
break;
case GameState.BATTLE :
// addKeyListener(battle);
// currentKeyListener = battle;
break;
}
}
0463デフォルトの名無しさん
2006/11/05(日) 18:44:21ありがとうございます
0464デフォルトの名無しさん
2006/11/05(日) 19:16:24最適化の肝は実測にあるので、
与えるデータや初期値や負荷係数などのパラメータを実際に変えながら、
最適ポイントを求めてみるとか。
0465ぴゅあ
2006/11/05(日) 23:01:42>状態数が多くキー処理の数がものすごく多いのでなるべく分けておきたいなぁと。
いや別にリスナそのものは状態に応じた分岐までとかでもいいんじゃないでしょうか
(AKeyListener,BKeyListenerと分けたかったメソッドを用意して状態によってそれへの分岐だけとか)
その先は好きなだけ(機能もグループ分けしたりとかでメソッド分けするとか)どうにでもなるのでは?
そうすることでより見通しがよくなりそうに思えますけど
逆にadd/removeだと、状態が変わることとadd/removeのタイミングが保証できているかとか
疑問が出てきたりもするかも?
0466ぴゅあ
2006/11/05(日) 23:05:39なので、いずれにしても状態とリスナが呼び出されるタイミングに配慮する必要は
あるだろうと思う
(たぶん、ちゃんと考えてないと、"動きが怪しい"とか後で悩むことになりやすい部分だろうと思いますよ)
0467デフォルトの名無しさん
2006/11/06(月) 03:06:52capacity の 80% くらいデータが埋まると capacity の拡張が起こったはず。
正確な値はソースをみないとわからないが。
なのでその拡張が起こる直前で収まるような inital capacity を与えれば最適になる。
0468デフォルトの名無しさん
2006/11/06(月) 03:11:17■ このスレッドは過去ログ倉庫に格納されています