トップページ⇒tech
1001コメント461KB

【初心者】Java質問・相談スレッド94【大歓迎】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/21(火) 06:11:54
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下の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質問・相談スレッド93【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1149349035/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/

次スレは>>980あたりで。
0232デフォルトの名無しさん2006/11/26(日) 14:39:33
もうね、イベントループしてるスレッドにキューでも作って「プログレスバーの表示を〜にしてね♪」みたいなメッセージでも突っ込んでおけばいいんですよ
0233デフォルトの名無しさん2006/11/26(日) 14:44:14
あげちまった...
ついでに内部クラスHogeを使う方法はこれまずいね。
こうすべきか。
public void test() {
int j = 0;
class Hoge implements Runnable {
private int k;
Hoge(int k) { this.k = k; }
public void run() { jProgressBar.setValue(k); }
}
for (int i = 0; i <= 10000000; i++) {
j++;
if (j % 100000 == 0)
javax.swing.SwingUtilities.invokeLater(new Hoge(j));
}
}

>>232
SwingWorker?
0234ぴゅあ2006/11/26(日) 15:49:18
>>231,>>233
最近のチュートリアルにはSwingWorkerが出てきているみたいですけど
最新はまだ触ってないので代わったわけとか見れてないけど

触るならEventQueue#invokeLaterとかなのかなとも思えたりもするけど
深く追えてはないし(ついさっき例が出てきて触ってみてるだけだし)
今のところはまだ微妙な気もしていたりするけど…
0235ぴゅあ2006/11/26(日) 16:01:42
あぁあとJProgressBar#setValueの方は
(5.0のソースコードで)その先のfirePropertyChangeメソッドで
イベントキューに溜めて処理してるんじゃないかと思ってて

JProgressBar#setValue自身がスレッドセーフかというのは
別途JProgressBar#setValueを扱う側で考えるのかな…
(SwingUtilities#invokeLaterを使うとかいうのではなく)
とか思ってたりしてますけど。。。
02362202006/11/26(日) 21:58:41
>>221
>>222
>>223
レス有難うございます。

まず223の回答から
>> > javaランタイム入ってないのに
>> はどうやって確信を得たんだ?
プログラムの追加と削除からIBM-Java Runtime 32bit〜削除。
そしてOSはXP_SP2の為、Microsoft VMも無いこと確認。

222の回答
>>・実はJavaアプレットではなくflashだった。
Javaアプレットでした。

となると221の
アプレット起動時、javaのロゴが表示されて、
何かダウンロード中みたいだったのがJREのインストールだったのかな?
>> ・アプレット起動時にJREがインストールされたが、それに気づかなかった。
が正解な感じがします。

>>221
>>222
>>223
ありがとうございました。
02372022006/11/27(月) 00:11:33
>>214>>218>>227>>232
イベントディスパッチスレッドはシングルスレッドだから固まるんですね。
(知ったように書いていますが実はまだ危ういです)
それだから actionPerformed(ActionEvent); でスレッドを作って test() をよびだすんだと
今やっと分かりました。(スレッド越しと言うのは、一つのスレッド実行中に新しい別の
スレッドを作ることを指すのでしょうか?)
SwingUtilities.invokeLater(...); が必要か、な議論はルールだから守らなきゃくらいしか
自分には分かりませんでしたが、Runnable を実装したクラスをイベントディスパッチ
スレッドに渡して(安全に?)スレッドを起こしてもらうためのものなんですかね?
でも、とりあえず使い方は分かりました。無事動きましたしほんとに助かりました。

また、余計な話ですが、内部クラスからローカル変数を参照するのに final が必要でも、
イスタンスフィールドならそのまま参照できるのを知って自分の素人さも痛感しました。
なぜそうなるのか、また自分で調べてみます。そして書き方もいろいろあるのが面白くて
楽しかった。深い人に教えてもらえて嬉しかったです。余裕ができたら SwingWorker も
知りたいですが、208さんが言った Swing 本も近々探して早く勉強したいです。
ありがとうございました。
0238デフォルトの名無しさん2006/11/27(月) 00:19:56
>>237
つ SwingWorker
0239デフォルトの名無しさん2006/11/27(月) 02:12:40
さぁさぁ!
スレが殺伐としてまいりました・・・!!!タタタタ・・
0240デフォルトの名無しさん2006/11/27(月) 11:25:04
同じパッケージ内にある別々のファイルのクラスにアクセスする方法は、
同じファイル内のクラスにアクセスするのと同じでしょうか?

sample1とsample2があってこの中でクラスを共有したいのですが、
参照しようとすると

Exception in thread "AWT-EventQueue-0

このようなエラーが出てきます。
0241デフォルトの名無しさん2006/11/27(月) 11:28:57
それはあなたが馬鹿だからです。
0242デフォルトの名無しさん2006/11/27(月) 12:05:50
そ?!そんなああああ!!!
0243デフォルトの名無しさん2006/11/27(月) 12:48:10
>>240
packageの概念についてもっと勉強した方が良い
0244デフォルトの名無しさん2006/11/27(月) 18:29:29
class Loop10 {
public static void main(String[] args){
double a0=3;
double d=4;
int number=100;
double a;
for(int i=0;i<number;i=i+1){
a=a0+d*i;
System.out.println(a);
}
System.out.println("END");
}
}
すみません。前にも似た感じの質問したんですけれど、
今度はこの等差数列の初めと終わりの解を3個づつ表示
したいんですが、配列を使ってどうしたらいいか教えて
くださいです。
ちなみに配列として扱ったものならば>>205で答えていただきましたが
ここに書き足すものが何か分からないです・・
0245デフォルトの名無しさん2006/11/27(月) 19:34:14
テーブル状に表すことが出来るデータを格納するとき、どんなデータ構造を使うのが適しているでしょうか?

LinkedHashMap<Integer,LinkedHashMap<Integer,String>> table;
今、こんなのを作って使っているのですが・・・
0246デフォルトの名無しさん2006/11/27(月) 20:21:35
>>245
二次元テーブルならArrayList<ArrayList<String>> table;でいいんでないかい?
スパースなのならメモリ効率悪いが
0247デフォルトの名無しさん2006/11/27(月) 21:33:20
>>245
独自クラス書いた方がよくないか?
縦で抽出したり、横で抽出したりするだろうから
>>246のArrayList入れ子を縦横と横縦で持つような。
0248デフォルトの名無しさん2006/11/27(月) 22:18:12
public class Fullname{
Person[] p = new Person[2];
p[0]=new Person("UDO","SUZUKI");
p[1]=new Person("TAKAAKI","ISHIBASHI");

/*略*/
}
class Person{
String first;
String second;
Person(String first,String second){
this.first = firtst;
this.second = second;
}
}

としたら
Temp.java:3: ']' がありません。
p[0]=new Person("UDO","SUZUKI");
^
Temp.java:3: <identifier> がありません。
p[0]=new Person("UDO","SUZUKI");
^
Temp.java:4: ']' がありません。
p[1]=new Person("TAKAAKI","ISHIBASHI");
^
Temp.java:4: <identifier> がありません。
p[1]=new Person("TAKAAKI","ISHIBASHI");
^
エラー 4 個

とエラーが出てしまうのですが何が原因か分からないです。。。
0249デフォルトの名無しさん2006/11/27(月) 22:23:17
>>248
FullnameクラスをTemp.javaファイルに保存しているのが敗因その1。
クラス名とファイル名は一致させること。
0250デフォルトの名無しさん2006/11/27(月) 22:26:31
>>249
すいません、直したやってみましたが駄目です。。
0251デフォルトの名無しさん2006/11/27(月) 22:47:18
p[0]=new Person("UDO","SUZUKI");
p[1]=new Person("TAKAAKI","ISHIBASHI");
ここはメソッドの中じゃないとまずいんじゃないか
0252デフォルトの名無しさん2006/11/27(月) 22:56:41
>>251
解決しました!メソッドの中じゃないと駄目なんすですか。。知らなかったです。ありがとうございました!
0253デフォルトの名無しさん2006/11/27(月) 22:59:43
都内で平日夜間か土日に通えるJAVAのスクールってどんなとこがあるかな?
リナックスアカデミーは開講日が合わず断念。
(次は二月〜らしい)
一応初心者レベルは脱したつもりだからちょいとレベル高めの講座とかあるといいんだが。
0254デフォルトの名無しさん2006/11/27(月) 23:21:51
>>253
高いレベルを目指すならプログラム書いて独学でしょ。
今時、Javaの情報なんてググればいくらでもでてくるし。

というか、スクールでプログラム言語を勉強するという感覚が未だに分からんです。はい。
学術的にということであれば、大学の講座を受講するという手もあるかも。
Javaって言語に特化した授業なんてあるかしらんけど。
0255デフォルトの名無しさん2006/11/27(月) 23:33:27
>>253
http://suned.sun.co.jp/JPN/catalog/java.html
0256デフォルトの名無しさん2006/11/27(月) 23:39:25
今勉強しているサンプルプログラムの
クラスの中にstatic{}という構文があったんだけど
これって何ですか?
いつ実行されるんですかね?

static{
 〜
 〜
}

staticでググッてもstatic修飾子の話しかでてこないっす
0257デフォルトの名無しさん2006/11/27(月) 23:44:49
>>256
static イニシャライザ、ですね。
クラスのロード時に実行されます。
0258デフォルトの名無しさん2006/11/27(月) 23:50:28
>>257
うす。どうもっす。
0259デフォルトの名無しさん2006/11/28(火) 00:00:54
Encodeの為の i18n.jar ってどこから入手するの?
J2SDK1.4.13、JRE1.4.13 のlib およびjre\libの中には入っていませんでした。

知ってる方教えてください。
0260デフォルトの名無しさん2006/11/28(火) 00:16:08
連続した数字の4番目と5番目の間に文字を入れることはできますか?

11334567→1133あ4567
0261デフォルトの名無しさん2006/11/28(火) 00:17:05
あい
0262デフォルトの名無しさん2006/11/28(火) 00:32:56
substring
0263デフォルトの名無しさん2006/11/28(火) 01:02:57
Javaで実行している環境のネットワークアドレスとブロードキャストアドレスを取得するにはどうすればよいでしょうか?
0264デフォルトの名無しさん2006/11/28(火) 01:05:51
>>260
new StringBuilder("11334567").insert(4,"あ").toString()
02652602006/11/28(火) 01:10:15
ありがとうございます
0266前スレ8972006/11/28(火) 01:53:40
>>ぴゅあさん
1週間、課題の方をやってみましたがどうも掴めません。
質問があるのですが、アウトプット部分の

I: i=0
R2: a[0]=20
R1: min=20 a[0]=20
R: min=20

が、省略されるような形で組みなおせば良いのでしょうか?
0267デフォルトの名無しさん2006/11/28(火) 05:12:59
UIコンポーネントの生成はUIスレッドで行う
0268デフォルトの名無しさん2006/11/28(火) 05:19:42
LinuxでXWindowSystemをインストールしていない状態で、swingのGUIを用いてるアプリケーションを動作しようとするとどうなるでしょうか?
0269デフォルトの名無しさん2006/11/28(火) 05:38:59
乱数で0.002以上0.003未満を生成するプログラムの書き方教えてください。
0270デフォルトの名無しさん2006/11/28(火) 05:43:33
>>269
Math.random()/1000+0.002
0271デフォルトの名無しさん2006/11/28(火) 05:46:30
>>268
まずやってみてから、その動作が理解できない場合に、動作の詳細を添えて質問することを勧める。
0272ぴゅあ2006/11/28(火) 07:33:28
>>266
mainメソッド内のarrayMin()メソッドの呼び出しのところから
iの値と流れ(if(i>0)による分岐,arrayMin()の再帰呼び出し,return)に注目して
流れを書き出してみれば判ると思いますよ
(ロジックを目で追ってみる)

答えは"if(i>0)"をどうするかにあるんですけどね
適当にやったら"やったらできた"のようになりかねないので
ちゃんと目でロジックを追ってみるのがいいと思います

>組みなおせば良いのでしょうか?
組みなおす必要はないです
iの値とif文(iの値に対して)でどう分岐させるかだけ

答えが出れば、「それだけのことか」みたいなものかも知れませんけど
0273ぴゅあ2006/11/28(火) 08:12:14
>>266
あとarrayMin()メソッドの冒頭で
int n = i - 1;
とかして
>int min = arrayMin(a, i - 1);
はそのままでいいけど
"a[i - 1])"やif文の中のiはnに置き換えて考えてみるのもいいかも

単純なことに思えるかも知れないけど
iとnとは持つ意味が違うので
0274デフォルトの名無しさん2006/11/28(火) 12:29:09
>>263
そういやブロードキャストアドレスてどうすんだろう・・・
IPは、
for(Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();e.hasMoreElements();){
NetworkInterface inf = e.nextElement();
System.out.println("Interface:"+inf.getDisplayName());
for(Enumeration<InetAddress> ips=inf.getInetAddresses();ips.hasMoreElements();){
InetAddress ads =ips.nextElement();
System.out.println("IP:"+ads.getHostAddress());
}
}
で取れそうだけど・・・・
0275デフォルトの名無しさん2006/11/28(火) 19:03:53
>>263
Mustangだといろいろ便利になってるんだが。
InterfaceAddress#getBroadcast()とか。
とりあえずブロードキャスト投げたかったら255.255.255.255を使うんじゃだめ?
02762762006/11/28(火) 20:12:55
くだ質ですがカキコさせていただきます。Java歴1ヶ月とちょっとです。
Javaだけの話じゃなくなってしまうかもしれませんが、現在以下のようなコードを書いています。

void getdata() {
byte data[] = new byte[16]
data[0] = (byte)0x00;
data[1] = (byte)0xFF;
data[2] = (byte)0xE2;
data[3] = (byte)(AUDIO_VOL[apu.volume1] & 0x3F);
data[4] = (byte)0x00;
data[5] = (byte)0xFF;
data[6] = (byte)0xE2;
data[7] = (byte)(0x40 | AUDIO_VOL[apu.volume2] & 0x3F);
data[8] = (byte)0x00;
data[9] = (byte)0xFF;
data[10] = (byte)0xE2;
data[11] = (byte)(0x80 | AUDIO_VOL[apu.volume3] & 0x3F);
data[12] = (byte)0x00;
data[13] = (byte)0xFF;
data[14] = (byte)0xE2;
data[15] = (byte)(0xC0 | AUDIO_VOL[apu.volume4] & 0x3F);
return data;
}

↓続き
02772762006/11/28(火) 20:13:46

4バイトで1項目なのですが、以下のように場合によって

if(apu.volume1_enable) {
data[0] = (byte)0x00;
data[1] = (byte)0xFF;
data[2] = (byte)0xE2;
data[3] = (byte)(AUDIO_VOL[apu.volume1] & 0x3F);
}

返し値に書き込むかどうかを決定させたいのです。
その場合、data[]は可変長になるのですが、
これを上手く書く事ができません。
ByteArrayOutputStream.toByteArrayでやってみたり、
書き込んだサイズをカウントしておいて、
カウントしたサイズの配列にコピーしたりやってみたのですが、
速度が遅くなってしまいました。どなたか上手い書き方を教えていただけないでしょうか。
0278デフォルトの名無しさん2006/11/28(火) 20:26:37
>>277
まず、条件判定を全部して何バイト長になるか決定しておくというのは?
そして、書き込みのときは、
インデックスを変数にして i++ とかにしておく。
必要のない4バイトは飛ばされる。

もっとセンスのいい方法ありそうだけど。
02792762006/11/28(火) 20:37:42
int datasize = 0;
int index = 0;

if(apu.volume1_enable) datasize += 4;
if(apu.volume2_enable) datasize += 4;
if(apu.volume3_enable) datasize += 4;
if(apu.volume4_enable) datasize += 4;

data[] = new byte[datasize];

if(apu.volume1_enable) {
data[index] = (byte)0x00;
data[index+1] = (byte)0xFF;
data[index+2] = (byte)0xE2;
data[index+3] = (byte)(AUDIO_VOL[apu.volume1] & 0x3F);
index += 4;
}

if(apu.volume2_enable) {
data[index] = (byte)0x00;
.
.
.
という風にも書いてみたのですが、
わざわざサイズのインデックスを用意するのと、
その値の操作がスマートに書けなかったのです・・・。
これ位しか方法がないのならこう書くしかないのでしょうが・・・。
0280デフォルトの名無しさん2006/11/28(火) 21:07:04
class AutoIndexer{
private int idx;
public AutoIndexer(int c){
idx=c;
}
public int moveIndex(){
return idx++;
}
}

みたいなのを使っている。
英語は苦手。
02812782006/11/28(火) 22:30:11
ゴメン想定外のコーディングだ。それは。

if(apu.volume1_enable) {
data[index++] = (byte)0x00;
data[index++] = (byte)0xFF;
data[index++] = (byte)0xE2;
data[index++] = (byte)(AUDIO_VOL[apu.volume1] & 0x3F);
}

だと思った。
スピード追求してるみたいだからベタな書き方だけど。
サイズの計算なくすなら、まずは最大幅幅確保してからという手もありだ。
変数indexが最後には、サイズと一致しているハズだから
最後に
byte[] result = new byte[index];
System.arraycopy(data,0,result,0,index);
でいいんじゃない?
最大幅分のbyte配列のメモリは余計に使うけど。
0282デフォルトの名無しさん2006/11/28(火) 23:52:39
sleep中のスレッドを正しく破棄するにはどうすればいいのでしょうか?
stop()を使っているのですが、時々ThreadDeathが発生して困っています。
0283デフォルトの名無しさん2006/11/28(火) 23:54:15
interruptして自分で止まるのを待て。
InterruptedExceptionを無視するスレッドだったら安全に止める術はない。
02842762006/11/29(水) 00:09:49
>>280
ターゲットが携帯電話(iアプリ)なもので、クラスを使わずにやってみたいのです・・・。

>>281
有難うございます。
事前に容量計算+これでいくことにします。
随分恥ずかしいコードを書いてしまいました。
プログラミング自体初心者なのがバレバレですね。

>サイズの計算なくすなら、まずは最大幅幅確保してからという手もありだ。
>byte[] result = new byte[index];
>System.arraycopy(data,0,result,0,index);
試しにこれもやってみたのですが、
arraycopyで遅くなってしまうようです。
02852822006/11/29(水) 00:14:24
main(){
・・・
TM tm = new TM();
tm.start();
・・・
if(x == 1){
//tm.stop();
tm.interrpt();
}
}

class TM extends Thread{
 public void run(){
try{
 Thread.sleep(100000);
    a();
}catch(InterruptedException e){}
}

これで条件成立の場合、破棄されてa()が実行されることはないのでしょうか?
0286ぴゅあ2006/11/29(水) 01:01:30
>>285
まずThread#stop()はDeprecatedですよね

>sleep中のスレッドを
と条件を限定して言っているので問題ないでしょう
0287ぴゅあ2006/11/29(水) 01:04:25
というより、まずやってみればいいわけですが
(トレースするためのコードもちゃんと書いて)
0288デフォルトの名無しさん2006/11/29(水) 21:17:46
リトルエンディアン方式で格納されたバイナリデータをint型変数に読み込みたいのですがどう書けばよいでしょうか。
たとえば0x04 0x03 0x02 0x01というデータを32bitの0x01020304というint型変数にしたいのですが。
DataInputStreamとreadByte()使うのはわかるんですが・・・
0289デフォルトの名無しさん2006/11/29(水) 21:19:08
5つの入力値を配列に代入して合計値を求めたいのですが、
自分なりに考えた結果、sum=(a[0]+a[1]+a[2]+a[3]+a[4]); としたのですが、
このステートメントが明らかにおかしいと思われます。合計値を求めるには、どうすればいいのでしょうか?
import java.util.Scanner;
class CalcArray{
public static void main(String args[]){
float a[]=new float[5];
Scanner sc = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print((i+1) + "つ目の入力値:");
a[i]=sc.nextFloat();
             }
float max,min,sum,average;
max = a[0];
for(int i = 0;i<5;i++){
if(max<a[i]){
max = max + a[i];a[i] = max - a[i];max = max - a[i];
}
}
min = a[0];
for(int i = 0;i<5;i++){
if(min>a[i]){
min = min + a[i];a[i] = min - a[i];min = min - a[i];
}
}
sum=(a[0]+a[1]+a[2]+a[3]+a[4]);
average=(a[0]+a[1]+a[2]+a[3]+a[4])/5;
System.out.println("5つの入力値の最大値は"+max+"です。");
System.out.println("5つの入力値の最小値は"+min+"です。");
System.out.println("5つの入力値の合計は"+sum+"です。");
System.out.println("5つの入力値の平均は"+average+"です。");
}}
0290デフォルトの名無しさん2006/11/29(水) 21:33:39
>>289
max = max + a[i];a[i] = max - a[i];max = max - a[i];
と
min = min + a[i];a[i] = min - a[i];min = min - a[i];
でa[i]の値を変えているから
最大値最小値の求め方が異常だ
0291デフォルトの名無しさん2006/11/29(水) 21:38:23
>>290
この方法だと合計値は求められないんでしょうか?
0292デフォルトの名無しさん2006/11/29(水) 21:47:13
>>288
Integer.reverseBytes(int i)
0293デフォルトの名無しさん2006/11/29(水) 21:50:10
>>291
最大値最小値を求める部分をとっぱらっちゃえば求まる
sum=(a[0]+a[1]+a[2]+a[3]+a[4]);は明らかにおかしくない
最大値最小値の求め方について再考することを勧める
そんな複雑なことをする必要はないif(){...}の...に書く文はひとつでいいはず
0294デフォルトの名無しさん2006/11/29(水) 21:54:35
>>293
すいません。ほぼ独学で学んでいるもので、
他の最大値最小値の求め方を教えていただけないでしょうか?
0295デフォルトの名無しさん2006/11/29(水) 21:57:22
>>294
関数使え
0296デフォルトの名無しさん2006/11/29(水) 21:57:57
>>294
if(max<a[i]){
max = a[i];
}

if(min>a[i]){
min = a[i];
}

わざわざa[i]に代入して入力データを壊す意義が分からない
0297デフォルトの名無しさん2006/11/29(水) 21:59:29
ユーザーからの入力を記憶しているただ一つの配列、
更にこの先の計算に必要な配列の内容を書き換えるから
事故が起きる
0298デフォルトの名無しさん2006/11/29(水) 22:00:12
>>296
ありがとうございます。
今から書き直してみます。
0299デフォルトの名無しさん2006/11/29(水) 22:01:04
>>292
ありがとうございます。できました。
byte[]に読み込んでByteBuffer使う方法考えてたんですがこんなに簡単にできるんですね。
0300デフォルトの名無しさん2006/11/29(水) 22:29:58
はじめまして宜しくお願いします。
StrutsでWebアプリケーションを作成しているのですが、
多重ログインをさせたくない場合はどのように処理をさせればいいのでしょうか?
ログアウト時必ずDBのフラグを倒すと言う処理をしたいのですが。
セッション解放時+タイムアウト時の処理方法を教えてください。
XMLにsession-timeout設定+HttpSessionListenerを実装するクラスの作成
までは何とかわかりましたが、その他のXMLの設定やstruts-configの設定、
アクションクラスと別にHttpSessionListenerを実装するクラスを作らないと
ダメでしょうか?
HttpSessionListenerを実装するクラスの呼び出し方法が判りません。
わかる方詳しく教えてください。また、参考になるサイトはありませんか?
宜しくお願い致します。
0301デフォルトの名無しさん2006/11/29(水) 22:32:39
011001
111000
110011
っていう二次元配列があったら1の数にあわせて
2 1
3
2 2
っていうのを1次元配列に格納するプログラムを作りたいのですがどうすればいいのでしょう?
0302デフォルトの名無しさん2006/11/29(水) 22:40:08
ピクロス
0303デフォルトの名無しさん2006/11/29(水) 22:43:38
ピクロスじゃないんですけど
これだけ見ると確かにそんな感じに見えますね(・ω・;)
どなたかわかる方ヨロです
0304デフォルトの名無しさん2006/11/29(水) 22:47:14
String line;
この中に入っている文字列の1文字目から8文字目や
18文字目から26文字目を抽出する関数を教えてください。
0305デフォルトの名無しさん2006/11/29(水) 22:49:47
>>304
サブストリング
0306デフォルトの名無しさん2006/11/29(水) 22:52:21
>>305

そう思って以下のコーディングを行ったのですが、
シンボルを解決できないといわれます。

シンボル: メソッド substr (int,int)
場所 : java.lang.String の クラス
line2 = line.substr(1,8);

-----------------
String line;
String line2;

//読み込みデータがなくなるまで読み込み
while ((line = br.readLine()) != null) {
//書き込むデータがなくなるまで書き込み
line2 = line.substr(1,8);
bw.write(line2);
bw.newLine();
0307デフォルトの名無しさん2006/11/29(水) 22:55:16
substring
0308デフォルトの名無しさん2006/11/29(水) 22:56:12
>>307
省略形は不可でしたか。すみません、ありがとうございます。
0309デフォルトの名無しさん2006/11/29(水) 23:05:00
C+みたいにJAVA+って出ないんですか
フォームとかいちいち作るの面倒くさいんですけど
0310デフォルトの名無しさん2006/11/29(水) 23:09:14
>>309
C+何だそれは?C++のパクリ言語か?
0311デフォルトの名無しさん2006/11/29(水) 23:10:36
>>300
HttpSessionListenerは、web.xmlに登録して、サーブレットコンテナに呼んでもらうもの。
ただ、多重ログイン防止用途だとHttpSessionListenerは使えなかった。
まえやったときは、HttpSessionListener#sessionDestroyed()でログアウト処理をさせようとしたら、
既にセッションが無効になっていて、セッション内のユーザ識別子が取得できなかった。
ただ、Servlet APIには
> Notification that a session is about to be invalidated.
とあるので、コンテナのバグかもしれない(Tomcat 4.1.31)。俺の解釈違いか?

代わりに採った方法は、ユーザ識別子を持たせたオブジェクトに、HttpSessionBindingListenerを実装させるというもの。
このインタフェースを実装したオブジェクトは、セッションへの登録と破棄時にAPI規定のメソッドが呼ばれる。
セッション自体の破棄の時も呼ばれるので、その時にログアウト処理を行うようにした。
0312デフォルトの名無しさん2006/11/29(水) 23:20:45
>>296 すいません。今度は入力値にマイナスの値を1つでも入れないと、最小値が初期値0になってしまいます。
改善策お願いします。
import java.util.Scanner;
class CalcArray1{
public static void main(String args[]){
float a[]=new float[5];
Scanner sc = new Scanner(System.in);
float max = 0,min = 0,sum,average;
for(int i=0;i<5;i++){
System.out.print((i+1) + "つ目の入力値:");
a[i]=sc.nextFloat();
if(max<a[i]){
max = a[i];
}
if(min>a[i]){
min = a[i];
}
}
sum=(a[0]+a[1]+a[2]+a[3]+a[4]);
average=(a[0]+a[1]+a[2]+a[3]+a[4])/5;
System.out.println("5つの入力値の最大値は"+max+"です。");
System.out.println("5つの入力値の最小値は"+min+"です。");
System.out.println("5つの入力値の合計は"+sum+"です。");
System.out.println("5つの入力値の平均は"+average+"です。");
}
}
0313デフォルトの名無しさん2006/11/29(水) 23:25:44
>>301 たぶんこんな感じ
改行おかしいのは行数制限のせいだから気にするな
static int[][] num1(int[][] x){
int[][] ret=new int[x.length][(x[0].length+1)/2]; int[] num=new int[x.length]; int n=0;
for(int i=0;i<x.length;i++){ for(int j=0;j<x[0].length;j++){
if(x[i][j]==1) n++;
else if(n!=0){
ret[i][num[i]]=n;
num[i]++;
n=0; } }
if(n!=0){ ret[i][num[i]]=n; num[i]++; n=0; }
int[] a=new int[num[i]];
for(int j=0;j<num[i];j++) a[j]=ret[i][j];
ret[i]=a; }
return ret; }
0314デフォルトの名無しさん2006/11/29(水) 23:29:05
>>312
maxとminにa[0]を入れるのが一番楽
0315デフォルトの名無しさん2006/11/29(水) 23:30:41
>>313
�d おかげさまで宿題できました
0316デフォルトの名無しさん2006/11/29(水) 23:59:50
文字列の長さがあるにもかかわらず、以下の範囲オーバーのエラーが出ます。なぜでしょうか。
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: -39
at java.lang.String.substring(Unknown Source)
at DeleteCheck.main(DeleteCheck.java:29)
--------------------
String line;
String line2;

//読み込みデータがなくなるまで読み込み
while ((line = br.readLine()) != null) {
//書き込むデータがなくなるまで書き込み
int len = line.length();
System.out.println("文字列sの長さは " + len + " です。");
System.out.println(line);
if ( len > 49){
line2 = (line.substring(1,8)+line.substring(40,1));
bw.write(line2);
bw.newLine();
}
0317デフォルトの名無しさん2006/11/29(水) 23:59:54
>>312
あー、初期化のとこまで見てなかったよ
float max = Float.MIN_VALUE,min = Float.MAX_VALUE,sum,average;
Scannerで配列にデータを読み込む前にmin,maxを初期化するのならこうかな
0318デフォルトの名無しさん2006/11/30(木) 00:02:10
4列のcsvファイルに入れる場合で、キーボードから打ち込んだ時に、
test1,test2
と、途中でnullとした場合にエラー処理したいのですが、どうにも上手くできません。

while(check == 0){
InputStreamReader isrAdd = new InputStreamReader(System.in);//キーボードから追加内容読み込み用インスタンス
BufferedReader kbwordAdd = new BufferedReader(isrAdd);//キーボードから追加内容読み込み用インスタンス
String Addword = kbwordAdd.readLine();//キーボードから1行読み込み
File file = new File(filename); // CSVデータファイル
if(Addword.equals(null)){
System.out.println("正しく入力して下さい。");
check = 0;
}
else {
BufferedWriter Addwrite = new BufferedWriter(new FileWriter(filename, true)); // 追記モード
Addwrite.write(Addword);//キーボードからの内容を新たな行に追加書き込み
Addwrite.newLine();//新しい行に書き込み
Addwrite.close();
System.out.println("書き込みました。");
check = 1;
}
わかる方はお願いします。
0319デフォルトの名無しさん2006/11/30(木) 00:02:58
>>316
1文字目のインデックス番号は0
配列と一緒で1から始まるのではない
0320デフォルトの名無しさん2006/11/30(木) 00:05:59
>>319
↓このようなことでしょうか?
 これでも同じくエラーになります。
line2 = (line.substring(0,8)+line.substring(40,1));

すみません。教えてください。
03213172006/11/30(木) 00:06:41
>>312
すまん。>>317は間違い
float max = -Float.MAX_VALUE,min = Float.MAX_VALUE,sum,average;
もしくは、 >>314のいうように、Scannerで読んだあとで
max = min = a[0];
0322デフォルトの名無しさん2006/11/30(木) 00:06:42
<!--* はじめ *-->
<table><tbody><tr><td>
<div style="background:#999;margin:10px 0px 0px 10px">
<div style="border:1px solid #000;background:#fff;position:relative;top:-7px;left:-7px;width:480px">
<table cellspacing="0" cellpadding="0"><tbody><tr><td>
<div style="padding:7px">
<a href="リンク先URL" target="_top"><img src="バナーのURL"
border="0" width="幅(ピクセル)" height="高さ(ピクセル)"></a></div>
</td><td style="border-left:1px solid #000;padding:7px;font-size:13px;color:#000;width:100%"
onclick="window.open('リンク先URL')" onmouseover="this.style.backgroundColor='#ffbbbb'"
onmouseout="this.style.backgroundColor='#fff'" align="center">
*ここにサイト名*
<table><tbody><tr><td style="font-size:13px;color:#000">
*ここに紹介*
</td></tr></tbody></table>
</td></tr></tbody></table></div></div>
</td></tr></tbody></table>
<!--* おわり *-->

このソースで右側のテーブルでマウスオーバーで色を変えるだけで
リンクはジャンプしないようにするにはどうしたらいいのでしょうか。
0323デフォルトの名無しさん2006/11/30(木) 00:08:29
>319
これでエラーがなくなりました。
引数2が引数1からの桁数だと思っていたことが原因のようです。
line2 = (line.substring(0,8)+line.substring(40,41));
0324デフォルトの名無しさん2006/11/30(木) 00:10:51
>>320
substringの第2引数は長さではなく終了インデックス
注意点は、終了インデックスは取り出したい最後の文字ではなく、その次の文字のインデックス
0325デフォルトの名無しさん2006/11/30(木) 00:12:50
>>324
ありがとうございます。
0326デフォルトの名無しさん2006/11/30(木) 00:13:19
>>317
ありがとうございました。おかげ様でできました。
0327デフォルトの名無しさん2006/11/30(木) 00:16:33
>>322
javascript関係は板違いなので、こちらへどうぞ
http://pc8.2ch.net/hp/
0328デフォルトの名無しさん2006/11/30(木) 00:17:28
>>314
一応317さんのお陰でできましたが、
その方法でもやってみようと思います。
03293172006/11/30(木) 00:18:02
>>326
混乱させて申し訳なかった
03303222006/11/30(木) 00:19:35
>>327
ありがとうございます。板違いである事すらわかりませんでした。
みなさまお目汚しごめんなさい。
0331デフォルトの名無しさん2006/11/30(木) 00:22:44
>>328
気づいてると思うけど>>317でなく>>321の方ね
>>317の方はmaxを0で初期化するのとほとんど同じ結果になってしまう
■ このスレッドは過去ログ倉庫に格納されています