【初心者】Java質問・相談スレッド104【大歓迎】at TECH
【初心者】Java質問・相談スレッド104【大歓迎】 - 暇つぶし2ch262:デフォルトの名無しさん
07/08/05 13:58:18
模範的なコードを意味も含めて理解することが勉強ではないのか?w

263:デフォルトの名無しさん
07/08/05 13:59:59
>>262
お前自身が何も理解してなさそうだな。この流れをみるに。

264:デフォルトの名無しさん
07/08/05 14:02:00
>260の頭が悪いということは解った

265:デフォルトの名無しさん
07/08/05 14:02:53
初学者がvolatileって単語にたどり着いてる時点でGoサインはでてるだろ
いじって覚える絶好のころあいだと思うのだが違うのか?

266:デフォルトの名無しさん
07/08/05 14:27:56
別の人がさわらないプログラムだからと言って、クラス変数を全てpublicにしたら怒られそうですが。

public class Hogegege
{
  private String name__;

  public String getName()
  {
    return new String(name__);
  }
}

っていうように、クラス変数を要求されたときに
新たに生成したものを返して絶対に変更できないようにした方がいいんでしょうか?
それとも単に return name__; でOK?

267:デフォルトの名無しさん
07/08/05 14:32:10
String は元から絶対に変更できないから単に return でOK。
変更できるようなオブジェクト (普通の配列とか) は clone した方がいいこともある。

268:デフォルトの名無しさん
07/08/05 14:40:46
StringやIntegerなどは不変クラスと呼ばれる値オブジェクトとして理想的な構造を持ってる。

例えばOSごとの改行コードを返すクラスがあるとして、
それがchar[]で返されるものなら、それは return clCode.clone(); とかすべき。
コレクションならCollections.unmodifiable系メソッドでラップするのもよし。

269:デフォルトの名無しさん
07/08/05 14:50:07
定数にコレクションを使うときに下のようにすることもある。

public static final Set<String> SUPPORTED_LANGUAGE;
static {
    Set<String> set = new LinkedHashSet<String>();
    set.add("ja");
    set.add("en");
    SUPPORTED_LANGUAGE = Collections.unmodifiableSet(set).;
}

270:デフォルトの名無しさん
07/08/05 14:52:08
要求された側が何をしたいかにもよる
要求された側も何をさせてOKかを考える
その上で生で公開させてもいいし、防御的にコピーを返してもいい
結局は要求次第だが、なるべくは防御的にするのがセオリー

Stringに関しては>267,268の説明の通り
たが、char[]をコピーするか否かは要件次第なので、一概にコピーするべきとは言えない

271:デフォルトの名無しさん
07/08/05 15:41:35
変なのが騒いでるが
だれか満を持してネタ投下した>>255に突っ込んでやれよw

UTF系は固定長じゃないぞ。

272:デフォルトの名無しさん
07/08/05 16:15:11
UTF-32は固定長だが、UTFじゃなかったのか。

273:デフォルトの名無しさん
07/08/05 17:10:30
UTF-32は21bitになったUnicode3.1の全コードを単一のbit長で表現するために
後から作られたから可変長にする必要がないだけだよ。
アレが特殊。21bit範囲内はUCS-4と互換性を取るって目的もあるし。

可変長より固定長の方が扱いやすいからbitの無駄使いより扱いやすさを優先した符号化方式。

UTFは元来可変長で表すもの。

274:デフォルトの名無しさん
07/08/05 17:13:49
サロゲートがそもそも後付けだろ

275:132
07/08/05 17:31:38
連結って意味だったんですね^^;
謎が解けましたorz

ありがとうございました。

276:デフォルトの名無しさん
07/08/05 17:48:43
サロゲートが後付けって言うかUnicode作り出した段階で
すでに16bitじゃ足りないのは分かってたけどそれに対処したのが遅れただけ。
実装側の互換性の問題とかがあったから。

277:デフォルトの名無しさん
07/08/05 18:02:43
StringBuffer key = new StringBuffer();
Random random = new Random(タネ);

for(int index = 0;index < 20;index ++)
{
  key.append((char)('A' + random.nextInt() % 26));
}

ランダムなAからZまでの文字を20個追加したいのですが、
変な文字列が連結されます。何がいけないのでしょうか?
おしえてください。

278:デフォルトの名無しさん
07/08/05 18:08:47
>>277
nextInt()は32ビット乱数のはずだから負数も取った気がした。
0と自然数だけ欲しければnextInt(26)ってやれば0~25をとるよ。

279:デフォルトの名無しさん
07/08/05 18:10:52
>>277
出来ました!どうもありがとうございます。

280:デフォルトの名無しさん
07/08/05 18:13:04
>>277
random.nextInt() でマイナスも含まれるから。
試しにrandom.nextInt() だけ出力してみるといい

random.nextInt() にはオーバーロードメソッドで、0からnまでの乱数を返すrandom.nextInt(n) がある
random.nextInt(26) で試せば期待した結果になると思われ

281:デフォルトの名無しさん
07/08/05 18:23:18
アンカーミスった
>>278 >>280
思い通りの動作が出来ました、どうもありがとうございますm(_ _)m


282:デフォルトの名無しさん
07/08/05 19:52:27
>>276
サロゲートペアはUnicode誕生から5年後に導入されたんだが。
適当なこと書かないでおくれよw

283:デフォルトの名無しさん
07/08/05 21:45:02
小生、Eclipseを使って開発しているのですが
本日「BufferUnderflowException」なるものが発生しました。
ググってみたところ「相対「get」操作がソースバッファのリミットに達したときスローされる、チェックされない例外です。」
との記述があったのですがよく意味がわかりませんでした。
ここでいうソースバッファのリミットとはコンパイラーのメモリのことを指しているのでしょうか?
もしメモリ関連のサイズのことを指しているのでしたらどこで設定できるのかどなたか教えていただけないでしょうか?
ちなみにEclipseの設定→Java→インストール済みのJREに指定しているのは最新のJRE1.6.0です。

284:デフォルトの名無しさん
07/08/05 21:53:47
いや。
java.nio.ByteBufferあたりのクラスのget系メソッドでサイズをオーバーして読み込んでしまった意味。
配列で範囲外のインデックスを使ったっていうのに近い。 単にプログラミングミス。

285:デフォルトの名無しさん
07/08/05 22:04:45
>>283
相対操作はpositionが読み込んだ値のバイト数分先に進むんだよ。
あと何バイト読み込めるかはremainingで確認できる。

構造体チックに各メンバ変数の並びを仮定して使うなら、0, 4, 8みたく
プリミティブごとのバイト数を足して絶対アクセスすればいい。

286:デフォルトの名無しさん
07/08/05 22:10:18
プログラムミスだなんて・・・・そんな・・・
実績のある会社が提供してる有料のライブラリーに含まれるメソッドを使ってたんだけど
使い方がわるかったのかなぁ・・・あーもう嫌ぽ

287:デフォルトの名無しさん
07/08/05 22:20:12
すいません、javaである処理を実行すると
コンソールの初めあたりに以下のようなエラーメッセージが出て
VM?ごと処理落ちしてしまいます。
しかもこれは必ずは発生するというわけではなくて不定期に出てしまいます。
不定期ですが処理を繰り返しているとすぐ発生する感じです。
JREのランタイムも最新のものを指定いるのですが相変わらず発生します。
どなたかわかる方がいらっしゃいましたら教えてください
「An unexpected error has been detected by Java Runtime Environment」

288:デフォルトの名無しさん
07/08/05 22:29:50
エラーログ嫁

289:デフォルトの名無しさん
07/08/05 22:39:56
申し訳ありません。エラーログ?を読んでもさっぱりわかりませんでした。
通常のログとは違ってこの処理落ちの場合にのみ生成されるログをのことだと思いますが
なんか「Thread」「Process」「System」といった感じにわけられて情報を
ダンプしているような感じに見受けられましたがエラー原因となるような記述は
書かれているのかいないのかサパーリでした。なにか読み方があるのでしたら教えてください

290:デフォルトの名無しさん
07/08/05 23:03:08
URLリンク(forum.java.sun.com)
こういう感じのやつか?

最初のほうの#がついた行をうpしてみ

291:デフォルトの名無しさん
07/08/05 23:27:01
あぁそれですわ。でもログは職場のマスィーンにあるので今うpできんのです申し訳ないです

292:デフォルトの名無しさん
07/08/06 00:13:57
>>286
ソースコード読んでみろ
実績のある会社ならばソースコードくらい提供できる
出来ないとか抜かすならば金払う必要なし
逆コンパイルしてバグ見つけて訴訟もおk

293:デフォルトの名無しさん
07/08/06 00:42:55
>>287
それってJavaからネイティブモジュール読み込んでます?*.dllファイルとか?
それだともしかしたら、PCの相性が悪いだけかもしれません。
自分もJNIを用いたプログラムでブルースクリーン出した事がある。しかも不定期。。



294:デフォルトの名無しさん
07/08/06 01:06:59
ネイティブ使用ならVM引数にXcheck:jniをつけてみる
しかし>>287のよーな現象に陥ったことがない為役にたつかはわかんない。

295:デフォルトの名無しさん
07/08/06 01:15:05
>>286
まぁその会社のサポート窓口に訊いてみれば?
使い方の問題にせよバグにせよ、なんらかの返答はあるでしょ。

296:デフォルトの名無しさん
07/08/06 01:16:58
JDI でオブジェクト生成を監視するのってどうすれば良いとおもう?

297:デフォルトの名無しさん
07/08/06 03:02:37
>>282
お前は日本語理解しような。

16bitじゃ足りないのは初期段階から分かってたけど実装側を無視できなかったから"Unicode誕生から5年後に導入された"んだろうが。

だいたいjavaなら普段は拡張面無視してるからUTF-16で16bit単位の可変長だろうが。

固定長なのはUCS-2ですよw

298:デフォルトの名無しさん
07/08/06 08:10:39
UCS-2 UCS-4 っていうのは文字集合であってエンコーディングじゃないんでは?

299:デフォルトの名無しさん
07/08/06 12:16:16
>>252
単純にやりたいなら、java.text.BreakIterator#getWordInstance()
本格的にやりたいなら、形態素解析が必要。

300:デフォルトの名無しさん
07/08/06 18:37:52
//Sample1
AAAAA

 *

BBBBB

//Sample2
XXXXX
YYYYY
ZZZZZ
という中身のSample1.txtとうファイルを読み込んで
*の部分にSample2.txtというファイルの中身を書き加えて
Sample3.txtというファイルに書き込むとすればどうやって記述すればよいのか
教えてください。

//Sample3
AAAAA

XXXXX
YYYYY
ZZZZZ

BBBBB

301:デフォルトの名無しさん
07/08/06 18:41:13
>>300
1. Sample1.txtを読み込む
2. Sample2.txtを読み込む
3. Sample3.txt に Sample1.txt と Sample2.txt の内容を書き込む

302:デフォルトの名無しさん
07/08/06 18:46:53
Sample1.txtを少しずつ読む
*かどうか調べる
 *ならSample2.txtの内容をSample3.txtに書く
 *でないなら今まで読んだSample1.txtの内容をSample3.txtに書く
Sample1.txtの終わりまで繰り返す


303:デフォルトの名無しさん
07/08/06 19:30:00
>>301
>>302
ありがとうございます
やってみます

304:デフォルトの名無しさん
07/08/07 01:38:48
あの、関数の引数にfinalは付けるべきでしょうか。
関数内では値を変えることがないし変わって欲しくない場合、
finalを付けた方がいいとは思うんですが、
全てに付けているとパラメータの部分が長くなってしまい見づらいといえば見づらいです。
常識的にはどうするべきなんでしょうか。

305:デフォルトの名無しさん
07/08/07 01:49:10
>>304
限りなく好みかもしれない場所の1つだな
finalにした所でオブジェクトの内部は変更される可能性はある
引数に対して再代入する事自体を禁止し、FindBugsアタリでチェックしておけば不要とも言える
(逆に言えば、メソッド内で引数への再代入を防止する為にfinalを付ける、だがw)

個人的には不要派

306:デフォルトの名無しさん
07/08/07 01:50:10
final付ける場合と付けない場合もあるし、
つけなくてはエラーになるときがある。
べつに無理につける必要はないと思うのだが....


307:デフォルトの名無しさん
07/08/07 01:52:40
>>304
プロジェクトで決められてたら、それに従えばいい。そうでなければ好きにすれば良い。

経験的には手作業で final 付けてると、そのうち嫌気がさして止める。

308:デフォルトの名無しさん
07/08/07 02:06:45
一番最初にやるHelloWorldなんですけどテキストに書いて
それをコンパイルしようとしたんですけど
「javacは内部コマンドまたは外部コマンド、操作可能なプログラム
またはバッチファイルとして認識されていません」となってしまいます。
どうしたらコンパイルできるようになりますか?


309:デフォルトの名無しさん
07/08/07 02:08:35
環境変数でググれ

310:デフォルトの名無しさん
07/08/07 02:10:14
>>306
final付けなくてはエラーになると本気で思っているならば勉強不足
それは匿名クラスなどに参照を渡しているからだろう

311:デフォルトの名無しさん
07/08/07 02:10:26
環境変数PATHを設定する

312:308
07/08/07 02:23:25
とりあえずみんなが指摘してくれた通り環境変数見てみたんだけど多分あってると思う。
;C:\Program Files\Java\jdk1,5,0\binをpathに加えればいいんだよね?

313:デフォルトの名無しさん
07/08/07 02:23:54
JDBCでのデータベース接続ができなくて困っています。以下のように作業を進めました。

postgres@debian$ createdb hellodb

------Connector.java------
package db;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;

public final class Connector {
private static Connection conn;

static {
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException ex) {
throw new InternalError(ex.getMessage());
}
}

private Connector() {
}

public static Connection open() throws SQLException {
return DriverManager.getConnection("jdbc:postgresql://debian/hellodb", "postgres", "");
}
}


314:308
07/08/07 02:26:07
やっぱり駄目だ・・・誰か助けてくれ

315:デフォルトの名無しさん
07/08/07 02:27:05
カンマとピリオド再確認

316:デフォルトの名無しさん
07/08/07 02:33:38
あと、本当に 1.5.0 かどうかも。
実は 1.6.0 をインストールしてましたとか。

317:デフォルトの名無しさん
07/08/07 02:34:29
------ConnectorTest.java------
package db;

public class ConnectorTest {
public static void main(String[] args) {
System.out.println(Connector.open());
}
}

postgres@debian$ java -cp .:/usr/share/java/postgresql.jar db.ConnectorTest

------エラーメッセージ------
org.postgresql.util.PSQLException: Connection refused.
Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

db名、ユーザ名、パスワード名は大丈夫だと思うんですが・・・。

318:デフォルトの名無しさん
07/08/07 02:50:20
>>312
> ;C:\Program Files\Java\jdk1,5,0\binをpathに加えればいいんだよね?
を加えちゃいかん
;"C:\Program Files\Java\jdk1,5,0\bin"
空白文字の扱いを知らんのか

319:318
07/08/07 02:52:26
しかもピリオドでなくてカンマやんw
;"C:\Program Files\Java\jdk1.5.0\bin"

320:デフォルトの名無しさん
07/08/07 02:53:01
>>312
pathに加えた手順を説明してみて

321:デフォルトの名無しさん
07/08/07 03:01:01
java的にはfinalな引数を導入したのは内部クラスから参照するためって事を知ってる前提で話してるんだよね?

人に聞くくらいなら内部クラスない場合は好み程度、と考えておけば良いんじゃない?

自分からfinal付ける明白な理由もなさそうだし。

322:308
07/08/07 03:04:37
駄目だ・・・何でできないんだ?とりあえず315さんにいわれたようにカンマとピリオドはおk
そして318さんに言われたとおりに;"C:\Program Files\Java\jdk1.5.0\binってPathのあとに
つけて今にいたりました>>320


323:デフォルトの名無しさん
07/08/07 03:08:53
PATHをマイコンピュータのプロパティから変更してるなら、
プロパティをOK押して閉じてからコマンドプロンプトをいったん閉じて開きなおす。

324:デフォルトの名無しさん
07/08/07 03:10:35
そもそもC:\Program Files\Java\jdk1.5.0\binってフォルダの中にjavac.exeがあるのかね?

325:デフォルトの名無しさん
07/08/07 03:13:11
>>322
ちなみにうちの環境だと
C:\Program Files (x86)\Java\jdk1.5.0_01\bin
にjavac.exeはある

326:308
07/08/07 03:24:33
なんか頭がもうパニックだ・・・とりあえず本に書いてある通りに書くと
class Examplel {
public static void main(String args[]) {
System.out.println("This is the output from Examplel");
}
}
をかいてそれをファイル名はExamplel.javaにして保存。実行するためにコマンド開いてjavac Examplel.java入力するらしい。
もう俺にはお手上げです。

327:デフォルトの名無しさん
07/08/07 03:28:25
>>326
それは関係無い

コマンドプロンプトから
"C:\Program Files\Java\jdk1.5.0\bin\javac.exe" -version
って入れて Enter 押して結果を教えなさい

328:308
07/08/07 03:31:03
指定されたパスが見つかりませんたって出ました

329:デフォルトの名無しさん
07/08/07 03:31:06
ClassPath通してる?

330:308
07/08/07 03:33:52
よくわからない

331:デフォルトの名無しさん
07/08/07 03:33:54
C:\Program Files\Java\jdk1.5.0\libの中の
jarファイルにクラスパス通してないんじゃないの?

332:デフォルトの名無しさん
07/08/07 03:34:39
>>328
マイコンピュータ開いてCドライブ開いて・・・って辿っていってjavac.exeのあるフォルダ確認して。
Windowsの種類やJDKのバージョンによってこのフォルダのパスは変わるから。

333:デフォルトの名無しさん
07/08/07 03:35:11
よく釣りに付き合ってますねー
肝心なとこスルーして答えてないしメチャクチャ釣り臭いんですけど

334:デフォルトの名無しさん
07/08/07 03:36:37
>>333は教えることもスルーすることもできないゴミ

335:デフォルトの名無しさん
07/08/07 03:36:45
>>328
ってことは、原因は 『C:\Program Files\Java\jdk1.5.0 に Java SDK をインストールしていない』 ってことになるんだけど、
[1] ダウンロードした SDK の確認(JDK と JRE と間違えてないか)
[2] インストール場所の確認
をお願い

336:デフォルトの名無しさん
07/08/07 03:36:45
釣りだべ

337:308
07/08/07 03:45:11
ごめん釣りじゃなくて本当にわかんないんだよ・・・喧嘩しないでくれ
>>332よくわからない調べ方が。>>335も調べ方がわからない。本当にすまん。初心者なんだ。


338:デフォルトの名無しさん
07/08/07 03:45:46
>>337
次の各問いに○か×で答えよ
1.C:\はあるか
2.C:\Program Filesはあるか
3.C:\Program Files\Javaはあるか
4.C:\Program Files\Java\jdk1.5.0はあるか
5.C:\Program Files\Java\jdk1.5.0\binはあるか
6.C:\Program Files\Java\jdk1.5.0\bin\javac.exeはあるか

339:デフォルトの名無しさん
07/08/07 03:51:11
もうjavac.exeをハードディスクの中で検索したら?

340:308
07/08/07 03:55:34
1○
2○
すまんもうこれ以上わからん・・・


341:308
07/08/07 03:56:15
>>339
ごめん。どうすればいいですか?

342:デフォルトの名無しさん
07/08/07 03:56:28
実はJDKをインストールしていませんでしたというオチ?

343:デフォルトの名無しさん
07/08/07 03:57:58
>>340
じゃあJDKをインストールしてないんじゃないの?
これはPCに元から入ってるものじゃないよ
どこからダウンロードした?
そもそもダウンロードすらしてない?

344:308
07/08/07 03:58:09
いや本についてる奴インストールしたと思う。

345:デフォルトの名無しさん
07/08/07 03:58:13
>>341
たぶんね、まじめな話パソコンに慣れてからのほうが良いと思うんだ。
門前払いする気は無いんだけど、PC の知識はどうしても必要になるから、今のままだと今後さらに悩むことになる。

とりあえず寝れ。寝て起きてまた考えろ。

346:デフォルトの名無しさん
07/08/07 03:59:20
>>341
HDD内のファイル検索すらしたことが無いのか?
プログラミングはかなり時期尚早だよ。

347:308
07/08/07 04:01:15
>>345
なんかみんなの話聞いてたら確かに自分は早すぎるなと思ったわ・・・_| ̄|○
とりあえず今日はもう一回インストールしてみて寝ます。ありがとうございました。


348:デフォルトの名無しさん
07/08/07 04:03:34
>>347
インストールの途中で出てくる説明はよく読んでね
特にインストール先のフォルダを指定するところがあるだろうからそこはメモしておくといい

349:デフォルトの名無しさん
07/08/07 04:03:45
>>347
今みたいに、Java を勉強する過程で PC についての知識を深めるという荒業もある
じっくりやれば良いと思うぜー

350:308
07/08/07 04:16:29
>>349
>>348
ありがとうございます。まだ基本的な知識が抜けているので自分で勉強しながらROMしようと思います。
質問できるレベルに達したらまた顔をだそうと思います。

351:デフォルトの名無しさん
07/08/07 04:23:37
>>304
引数につけた final はメソッドを使う側からは見えないので、
完全にメソッドの実装側の都合となるためそれほど重要でない。

>全てに付けているとパラメータの部分が長くなってしまい見づらいといえば見づらいです。
ここ重要。使い捨てでない限り、ソースコードは人が読む文書。しかも、唯一完全な文書。

意図せず誤ってパラメータへの代入を防ぐメリットとのトレードオフだが、
それが一目で分からないような複雑なメソッドはむしろリファクタリングの対象と思われ。

不要派が多いんじゃないかな。自分も不要派

352:351
07/08/07 04:42:09
補足。

引数に final をつけることにより、
ソースコードの読み手にその意図を伝える役割があるが、
そもそも、引数に代入を行うこと自体が混乱を招くことなので
通常やらない(むしろ、そのようなコードはリファクタリング対象)。

したがって、この意味でも、引数に final をつける意義は薄れている
というのが、不要派のおいらの個人的意見

353:デフォルトの名無しさん
07/08/07 07:35:11
C++でもconstを引数に使うのはconst char *のようなケースだけだものね。

354:デフォルトの名無しさん
07/08/07 07:44:14
いやC++のconst参照渡しは中身を書き換えないところまで保障するから別だとおもうが……

355:デフォルトの名無しさん
07/08/07 08:09:04
char * const s といった使い方はまずしないということだろ。
javaでfinalにした場合はこの意味だから。

356:デフォルトの名無しさん
07/08/07 09:32:08
>>352
引数に代入行うと混乱するぐらい長いメソッド自体の方をリファクタリング対象にした方が良いような。
短いメソッドなら引数に代入されても大して混乱しないし。

357:デフォルトの名無しさん
07/08/07 09:52:57
>>356
長いメソッド云々の前に引数に代入すんな、って話だと思う
どっちも糞コードなのは間違いないが、長いメソッドは可読性が低いだけ、引数に再代入するってのはバグと言ってもいいだろう

358:デフォルトの名無しさん
07/08/07 10:04:10
Javaにもいい加減constとfriendクラスが欲しいです

359:デフォルトの名無しさん
07/08/07 10:16:01
>>357
なんで引数に代入しただけでバグになるんだ……

変更前の引数の値を期待してるところが残ってるのに、引数変更しちゃうと
バグの元になるってんならわからなくもないけど、短いメソッドなら修正容易だし。

360:デフォルトの名無しさん
07/08/07 10:17:14
URLリンク(www.vipper.net)
この中で削除して良い物は在りますか?

361:デフォルトの名無しさん
07/08/07 10:25:39
>>360
JRE が一つでもあればいいのなら、赤線の枠内は全部削除して良い。
J2RE5 が一つはあった方が良いなら、赤線の枠内は
J2SE Runtime Environment 5.0 update11 残して全部削除。

362:デフォルトの名無しさん
07/08/07 10:37:28
>>359
限りなくバグに近いだろう、例外の握りつぶしとかと同じレベル
極端な話、引数は自然にfinalでもいいだろうと思う

363:デフォルトの名無しさん
07/08/07 10:39:32
ついでに、6 の Update 2 があるんだから、
6 の Update 1 も削除していいんじゃない?

364:デフォルトの名無しさん
07/08/07 10:40:02
理由も無しに「バグに近い」とか言われても。夏だなぁ、としか。

365:デフォルトの名無しさん
07/08/07 10:50:36
理由も解らないなんて夏だな

366:デフォルトの名無しさん
07/08/07 10:50:39
>>362にとってはバグなんだろ
そっとしといてやれ

367:デフォルトの名無しさん
07/08/07 10:59:07
どっちでもいいんだけど、そもそもバグの定義ってなんだ?

368:デフォルトの名無しさん
07/08/07 12:25:51
質問よろしいでしょうか。

ある文字列をキーに検索を行うプログラムを作っています。
その文字列のキーをワイルドカード(一文字マッチは"?"で行います)でも使用できるようにしたいと思い、文字列を末尾から"?"に置換するメソッドを作りました。

String value = "AAAAA";
int len = value.length();
for (int i = 0; i < len; i++) {
  String s = exec(value, len, i);
  // 検索処理
}



public String exec(String _s, int _len, int _i) throws Exception {
  StringBuffer sb = null;
  try {
    sb = new StringBuffer(_s.substring(0, _len - _i));
    while (sb.length() < _len) {
      sb.append("?");
    }
    return sb.toString();
  } catch(Exception e) {
    throw e;
  }
}


369:デフォルトの名無しさん
07/08/07 12:26:05
自分の思った通りにならなくて駄々をこねる状態にさせるもの

370:デフォルトの名無しさん
07/08/07 12:27:55
これでAAAAA, AAAA?, AAA??, AA???, A????という文字列から検索を行えますが、
このメソッドを以下のような文字列を返すメソッドにしたいと思います。


パラメータが"ABC"なら、(2 ** 文字列長)回のループで以下の文字列を順番に返す。

1回目:ABC
2回目:AB?
3回目:A?C
4回目:A??
5回目:?BC
6回目:?B?
7回目:??C
8回目:???

どなたかご教示頂けないでしょうか。

371:デフォルトの名無しさん
07/08/07 12:35:51
>>370
32文字以下に限るけど、

2^n 回ループで、iが媒介変数だとして、
「iのmビット目が立っていたらm文字目を?に置き換える」という処理を
n回やればいいんでは。


372:デフォルトの名無しさん
07/08/07 13:12:42
buildSearchKey とかが良いと思うんだ

373:デフォルトの名無しさん
07/08/07 13:23:56
>>370
import java.math.BigInteger;
import java.util.*;
public class A implements Iterable<String> {
private String s;
public A(String s) { this.s = s; }
public Iterator<String> iterator() { return new B(); }
private class B implements Iterator<String> {
private BigInteger i = BigInteger.ZERO;
private final BigInteger m = BigInteger.valueOf(2).pow(s.length());
private final int len = s.length();
public boolean hasNext() { return i.compareTo(m) < 0; }
public String next() {
if (i.compareTo(m) >= 0) throw new NoSuchElementException();
StringBuilder sb = new StringBuilder(s);
for (int j = 0; j < len; j++) if (i.testBit(j)) sb.setCharAt(len - j - 1, '?');
i = i.add(BigInteger.ONE);
return sb.toString();
}
public void remove() { throw new UnsupportedOperationException(); }
}
}

374:デフォルトの名無しさん
07/08/07 13:24:37
使い方はこんな感じで
import java.util.*;
public class C {
public static void main(String[] args) {
Iterator<String> iterator = new A("ABCD").iterator();
while (iterator.hasNext()) {
String s = iterator.next();
System.out.println(s);//本当はsを使って検索処理
}
}
}

375:デフォルトの名無しさん
07/08/07 13:28:05
簡単に書くならこうでもいい
for (String s : new A("ABCD")) System.out.println(s);

376:デフォルトの名無しさん
07/08/07 14:18:24
引数への再代入は否定せんが仮引数名から
(変数の役割が)意味が変わる再代入は反対だな。アレは書いた奴にしか読めん。

friend欲しいのは設計が悪い。
constはjavaでは無意味。

377:デフォルトの名無しさん
07/08/07 14:34:18
constっぽいものはJSR-308のサンプルにある
@Readonlyが追加されたら近い事が出来るようになるかも?

378:デフォルトの名無しさん
07/08/07 14:44:21
>@Readonlyが追加されたら近い事が出来るようになるかも?
generics組み合わせたりすると型名がやたら長くなるのはいただけないけど、
コーディングミスを考えるとやむを得ないか……

379:368, 370
07/08/07 18:02:05
>ご回答下さった各位様
ありがとうございます。
少々違った形での実装となりそうですが、無事に進められそうです。

// 検索キーの桁数を考慮しないと酷い性能に……orz

380:デフォルトの名無しさん
07/08/07 18:09:40
なんかよくわからんが、元の検索キーから正規表現を構築してそれで検索した方が簡単じゃない?

381:デフォルトの名無しさん
07/08/07 19:42:29
集計やイテレータを担う変数など、変化することが前提であるもの以外は、
引数を含むローカル変数は基本的に再代入禁止にした方がよいし、そうすることが可能。

外科手術に例えると、高度な手術は可能な限り無菌状態を保つことで初めて可能になる
と、どこかのお偉いさんが言ってたヨ

また、このリファクタリングは、他のリファクタリングを行う際の前処理にもなる場合もある。
例えば、ローカル変数の内容をメソッドから取り出すようにリファクタリングする際、
内容がメソッドの場所によって変わってたら困る。

382:デフォルトの名無しさん
07/08/07 20:34:27
明示的にコンストラクターを起動している間、インスタンス・フィールド name は参照できません


このエラーはどういうことでしょうか?
調べてもわからなかったです。すみません。

383:デフォルトの名無しさん
07/08/07 20:49:06
スーパークラスのコンストラクタが終わるまでのあいだ this は使えない。
例えば

class A {
A(int x){}
}
class B extends A {
int x = 10;
B() {
super( this.x ); // ← これ
}
}

384:デフォルトの名無しさん
07/08/07 21:34:25
「世界でいちばん簡単」なe本なのに…
50ページ目のコンパイルで躓いてます。
javacがなんかおかしいみたい。何故だろう?

385:デフォルトの名無しさん
07/08/07 21:35:20
そんな本もってないからわからない。
くわしく

386:デフォルトの名無しさん
07/08/07 21:40:22
最初の「プログラミングしてみる」
という項目で

//MyJava

class MyJava{
   public static void main(String args[]) {
  System.out.println("My Java Program");
}
}
と、テキストで打ちました。
で、コンパイルするんですが


387:デフォルトの名無しさん
07/08/07 21:45:49
コマンドプロンプトで
「cd c:\MyJava」
「dir」
「javac MyJava.java」
と打つと

「'javac'は、内部コマンドまたは外部コマンド、操作可能な
プログラムまたはバッチファイルとして認識されていません」
と出てしまうのです。


388:デフォルトの名無しさん
07/08/07 21:52:13
JDK をインストールしているかどうか、
インストールしているならそのインストール先を確認して、
そのインストール先の bin フォルダを環境変数 PATH に追加する。
・・・その手の設定方法って本に載ってない?

389:デフォルトの名無しさん
07/08/07 21:54:41
>>388様、ありがとうございます。
最初に、JDKのインストールと、PATHの設定が載ってました。
それは本の通りに進んでいたのですが…

390:デフォルトの名無しさん
07/08/07 21:56:13
質問させて下さい。
int型のデータ「0xC01A」からString型のデータ"\uC01A"に
変換したいのですが、どのようなやり方がありますでしょうか?

391:デフォルトの名無しさん
07/08/07 21:59:19
>>389
コマンドプロンプトで PATH って打って、
JDK の bin フォルダがちゃんと追加されているかどうか確認する。
エクスプローラーでマイコンピュータから C: → Program Files → ... ってたどっていって、
本当にそのフォルダが存在していて中に javac があるかどうか確認する。

392:デフォルトの名無しさん
07/08/07 22:00:02
>>391様、ありがとうございます。
早速やってみます。

393:デフォルトの名無しさん
07/08/07 22:03:02
>>390
int x = 0xc01a;
String s = "" + (char)x;

""+ ってのがなんかイヤだったら、面倒いけど

String s = new String(new char[]{ (char)x });

394:デフォルトの名無しさん
07/08/07 22:04:27
>>389
URLリンク(www.shuwasystem.co.jp)
正誤表出ているが、パスの設定を1.4のデフォルトでやったんだろう

395:デフォルトの名無しさん
07/08/07 22:21:49
>>390
String str = Integer.toString(0xC01A);

396:デフォルトの名無しさん
07/08/07 22:24:52
すまん、間違えた

String str = Character.toString((char)0xC01A);

だな

397:デフォルトの名無しさん
07/08/07 22:27:56
>>391
C:\MyJava>path
PATH=C:WINDOWS\system32;C:WINDOWS;C:\WINDOWS\system32\Wbem;C:
\Program Files\pcbNavi\bin;C:\Program Files\Fujitsu\sa\dll;
c:\j2sdk_1.4.1_01\bin
と表示されました。
C: → Program Files →Java→の中にはjavacは無く、
C: → j2sdk1.4.1 01 →bin→javacとありました。

何か間違ったのでしょうか?

>>394様、ありがとうございます。
1.4.1 01を選んでダウンロードしたのですが…自信ないです。



398:デフォルトの名無しさん
07/08/07 22:31:06
アンダーバーの有無をよく確認してみて。
PATH の中の j2sdk_1.4.1_01 実は j2sdk1.4.1_01 が正しいんじゃない?

399:デフォルトの名無しさん
07/08/07 22:32:41
>>397
c:\j2sdk_1.4.1_01\bin\javac -version
ってコマンドプロンプトで打ち込んでみて

400:デフォルトの名無しさん
07/08/07 22:35:39
どうでもいいが、pathに設定してもろくな事ないと思うが・・・

401:デフォルトの名無しさん
07/08/07 22:39:51
>>390
new String(new int[] { 0xC01A }, 0, 1)

402:デフォルトの名無しさん
07/08/07 22:40:39
>>390
String s = "\\u"+ String.format("%x", 0xC01A).toUpperCase();

403:デフォルトの名無しさん
07/08/07 22:43:43
それなんか違うような・・・
ところで toUpperCase するなら %X でいいんじゃない?

404:デフォルトの名無しさん
07/08/07 22:52:02
>>398様、ありがとうございます。
j2sdk1.4.1_01 では通りませんでした。
>>399様、やってみます。

405:デフォルトの名無しさん
07/08/07 22:53:54
>>399様、「指定されたパスが見つかりません」となりました。

406:デフォルトの名無しさん
07/08/07 22:57:53
>>397 には javac のあるフォルダ名が j2sdk1.4.1 01 って書いてあるけど、1.4.1 と 01 の間は空白?
そうだったら PATH もそのように
一字一句同じ名前を入れてください

407:デフォルトの名無しさん
07/08/07 23:01:41
>>406様、すみません。_ありました。ここでの打ち間違いでした。

408:デフォルトの名無しさん
07/08/07 23:07:13
じゃあ、 >>397 の PATH には ...fujitsu\sa\dll; と c:\j2sdk... の間に改行が入ってるように見えるけど、
本当に改行やら無駄な空白が入っているのなら、取り除いてみてください。

409:デフォルトの名無しさん
07/08/07 23:18:09
>>408様、ありがとうございます。
もう一度やってみます。

410:デフォルトの名無しさん
07/08/07 23:25:49
>>405
エスパーしてみる
DドライブにJDK入っているとかじゃない?

エクスプローラーからjavac.exeを選んで、コマンドプロンプトにドラック&ドロップしてみてくれ
そこで表示されたパスをここにココにコピる

411:デフォルトの名無しさん
07/08/07 23:27:34
>>397
c:\j2sdk_1.4.1_01\bin
志村、sdkの後ろに_入ってるぞ
キーボードで入力するんじゃなくて、パスはコピー&ペースト汁

412:デフォルトの名無しさん
07/08/07 23:53:39
>>409
エクスプローラでアドレスバーを表示するようにしてないの?

413:デフォルトの名無しさん
07/08/08 01:05:36
皆様、ありがとうございました。
アンインストールしてもう一回始めからやり直してました。
そのおかげか、ソースコードを書き直したお陰か(本の文書の方では
『//MyJava』となってましたが、実際の画面を写した写真では『//MyJava.java』と)
PATHの方も、本を見るのではなく、>>411様の通りにコピペをしました。

何とか前進できました。

414:デフォルトの名無しさん
07/08/08 01:09:45
まずはWindowsの使い方から始めるべきだな

415:デフォルトの名無しさん
07/08/08 01:16:57
>>413
そんな違いよく見つけたね
でもコメントの違いはプログラムの動作に影響しない

416:デフォルトの名無しさん
07/08/08 01:17:41
>>414様、ありがとうございます。
頑張ります。
PC自体初心者なのに、訓練学校に入ってしまい今、毎日が勉強です。
今年中にブロンズとSJC-Aを取得するように言われていて…
努力しかないですね。

417:デフォルトの名無しさん
07/08/08 01:17:42
最近はコマンドプロンプトもbatもいらないからな

418:デフォルトの名無しさん
07/08/08 01:54:40
>>384
かわいそうだが、その本は地雷だから。

きみはもうしばらくしたら

  本の通りにやったのですがエラーが出てしまいます。

  精度が落ちている可能性
  検出値: double
  期待値: float
  a = 2.0;
  エラー 1個

という質問をするであろう。

スレリンク(tech板:354-364番)



419:デフォルトの名無しさん
07/08/08 07:12:47
独習が良いと聞き買ったが分厚いので持ち運びに不便であまり読まないwwwwwww


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch