ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaコミュの【質問専用トピvol.3】※注意書き必読

  • mixiチェック
  • このエントリーをはてなブックマークに追加
■質問専用トピックです。書き込む前に「以下の注意書きを必ず一読」してください。

★質問者は回答者に対し感謝の気持ちを忘れないようにしてください。
質問トピックはサポートセンターではありません。皆様の善意による意見です。
必要以上に堅苦しくなる必要はありませんが、最低限の礼節を持って書き込みましょう。
「課題の丸投げ」や「別コミュへのマルチポスト」は非常に嫌われます。

★疑問や質問を書き込む前に、「必ず自分で調べて」みてください。
特に初心者の方はgoogleあたりで"Java 初心者"などで出てくるページの入門部分をまずは何度も読んでみましょう。分からない言葉もその都度調べて理解に努めてください。

★質問者は回答しやすいように、状況を出来るだけ分かりやすく明確に書いてください。「分かりません」「教えてください」だけでは見てる人の方がよっぽど分かりません。「何が、どのように分からない」のか自分の状況を自己分析し、以下のテンプレを埋める形式で質問されると答えやすいかと思われます。

質問テンプレ
【1.目的】何をしたい(○○を期待している)かを明示する。
【2.環境】Javaのversion,OS,アプリケーションサーバの種類,DBなど
【3.経緯】どのような操作やコーディングを行ったかの説明
【4.結果】「3.経緯」の結果としてどのような動作やエラーメッセージが出力されるか
【5.見解】自分なりに調べたこと、分析や見解、どの程度のことまでは理解しているかを示す。


【前トピ】※同様の質問がないか「Ctrl+F」で全文検索をしてみてください。
  http://mixi.jp/view_bbs.pl?id=9215504&comm_id=1465&page=all
【Javaの課題丸投げ[コミュ]】
  http://mixi.jp/view_community.pl?id=1017129
【Java質問&情報提供サイト[コミュ]】
  http://mixi.jp/view_community.pl?id=368966
【Javaのインストール手順[外部リンク]】
  http://www.smg.co.jp/seminar/java/index.html
【Javaの道[外部リンク]】※まったくの初心者向け
  http://www.javaroad.jp/java_basic0.htm

コメント(1000)

こんにちは。XMLファイルの出力と、エンコーディングについて質問させて下さい。

XML形式でファイルを保存したいと思い、下記のようなコードを書きました。
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class Test {
public static void main(String[] args) throws UnsupportedEncodingException, IOException {
String encoding = "UTF-8";
StringBuffer buff = new StringBuffer();
FileWriter w;

buff.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
buff.append("<Document>");
buff.append("こんにちは");
buff.append("</Document>");

w = new FileWriter("test.xml");
w.write(new String(buff.toString().getBytes(encoding), encoding));
w.close();
}
}

しかし、safariなどのXMLが表示できるツールで表示させようとすると、エンコーディングエラーというエラーが出てしまいます。
w.write(new String(buff.toString().getBytes(encoding), encoding));
という部分で、エンコーディングをUTF-8に変換して保存しているつもりなのですが、この方法では駄目なのでしょうか?
ご存知の方、いらっしゃいましたら、教えていただけると嬉しいです。
お願い致します。
UTF-8になってませんね。
というより変換すらしていない。
個々の呼び出しを分解して、それぞれが何をしているか、説明できますか。
> 962: メガ さん

FileWriter ではなく、OutputStreamWriter を使用してください。
OutputStreamWriter の第 2 引数にエンコードが指定できます。
>mio さん
返信ありがとうございます。
分解して説明いたしますと、下記の通りになります。

String s1 = buff.toString(); //ここで、buffをString型に変換
byte[] b1 = s1.getBytes(encoding); //ここで、エンコーディングがUTF-8のbyte配列を作成
String s2 = new String(b1, encoding); //ここで、b1を、エンコーディングがUTF-8のString型に変換。
w.write(s2); //結果を書き込み

まどろっこしいのですが、この様に解釈して書きました。
もしかして、
String s2 = new String(b1, encoding);
の、encodingは、変換先のs2ではなく、変換元であるb1のエンコーディングを指定する部分なのでしょうか?
そしてそもそも、UTF-8型のString型というものは存在せず、String型にエンコーディングの区別は無いという事なのでしょうか?




>へび さん
OutputStreamWriter を使ったところ、無事出力できました!
ありがとうございます!
ご自分で答えに行き着いたようですが…。

>の、encodingは、変換先のs2ではなく、変換元であるb1のエンコーディングを指定する部分なのでしょうか?
getBytes()では、指定したcharsetでバイト配列のエンコードが決まる

逆にStringの構築はバイト配列のエンコードを指定する

という推論ができれば。


>そしてそもそも、UTF-8型のString型というものは存在せず、String型にエンコーディングの区別は無いという事なのでしょうか?
区別はないというか、StringはすべてUTF-16で格納されています。


JavaDocを読むだけで分かるという話もありますが。
(UTF-16の話も頭のほうにちゃんと書いてあります)

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#String(byte[], java.lang.String)
>mioさん
ありがとうございます!完璧に、理解できました!!
そういう方法はないと思うので。
最小化状態でバッチを起動するショートカットを作って、それを代わりに呼び出すのはどうでしょう。

やったことないので、できないかもですが。
> 969: c++ さん

何がしたいのか理解に苦しみます。
なぜバックグラウンドで起動させたいのか、背景がまったく見えないので、この文章からはいろいろな解釈ができてしまいます。

バッチファイルを Java から起動したいのであれば、このようにすればいいです。

  Runtime.getRuntime().exec( "cmd /c XXX.bat" ) ;
> 974: c++ さん

固まってしまうのは、多分、標準出力と標準エラー出力を適切に処理してあげていないからだと思います。
コマンドプロンプトから実行した場合、DOS窓にいろいろなメッセージが出力されていませんか?

Java から起動した場合、メッセージが数行であれば動くのですが、メッセージの量が大量だと、バッファが溜まってしまい、I/Oがブロッキングされ、プログラムが停止してしまいます。
ブロッキングされていても、バッファ(標準出力&標準エラー出力)を読み出してあげれば、またプログラムは動き始めます。

とりあえず、バッチファイルの標準出力と標準エラー出力をファイルにリダイレクトしてあげてみてはどうでしょうか?
以下のようにすると、標準出力を log.txt に、標準エラー出力を err.txt に出力するようになります。

  バッチファイル 1> log.txt 2>err.txt
eclipseでjarファイルを作ろうとしているのですが、上手くいきません。

エクスポートを選択してJava→JARファイル→次へ→生成されたクラス・ファイルとリソースをエクスポート と JARファイルの内容を圧縮にチェックを入れた状態で次へ→コンパイルエラーとともに〜とコンパイル警告とともに〜にチェックを入れた状態で次へ→マニフェスト・ファイルを生成にチェック
この状態でメイン・クラスを指定しようとして参照するのですが、参照先に何も出てきません。

原因がどこにあるのか分からないのと、初心者で適当にeclipseを弄ってるだけなので他に説明のしようがないのですが、よろしくお願いします。
うちは英語環境なので参考になるかわかりませんが、
Exportをメニューから選択すると、Select(選択?)の画面が出てきます。

そこで、3つあり、1つが Jar File, Javadoc, もう一つが Runnable JAR fileです。
Runnable JAR fileを選択してつくっています。

日本語環境で、これっぽいものを選択すれば行けるんではないでしょうか。
ありがとうございます
実行可能JARファイルというのがあるので多分コレかと思いますが、起動構成というところがなにも選択できず、次へや完了ボタンが非アクティブなままです

どのようにしているか教えていただけると助かります。
こーじさん、

なるほど。完了ボタンが非アクティブですね。

>この状態でメイン・クラスを指定しようとして参照するのですが、参照先に何も出てきません。

すみません。これを読んでおくべきでした。参照先がないのはディレクトリなどの設定、
パスの問題の可能性があります。何か新しいJava projectを立ち上げて、書いたコードを
貼り付けるか適当にhello worldのコードでも書いて、試してみてはいかがでしょうか。
その時、保存先などを確認して、左のパッケージツリーにちゃんと表示されることです。
それで、対象のクラスを選択してエキスポートを試みてみるのもありかと思います。
そもそもmainメソッドはあるんでしょうか。
あ、もしかしてappletはjarファイルにできないんですかね?
初歩的なことがわからずにすみません

ブラウザで表示するので我慢しようと思います。

それと、質問ばかりですみませんがたとえば

int player[][] = new int [3][200];
for(int i=0;i<200;i++){
player[0][i] = (int)(Math.random()*500);
player[1][i] = (int)(Math.random()*600);
player[2][i] = (int)(Math.random()*700);
}
のようにランダムで3次元に存在する200個のplayerを作って、それをplayer[2][i]で昇順にソートしたいのですが、
arrayとcomparatorを使うことはわかるのですが上手くいきません。

どのようにするか教えていただけないでしょうか

http://asistobe851.hp.infoseek.co.jp/my-memo/sort.html

このサイトとか見てるのですがいまいち・・・。
player[2][i]はintですよ。
player[2]はint[]です。
player[2]をソートしたいのであれば
Arrays.sort(player[2]);
でいいんですが。

参考にされているサイトとやりたい事は一致していますか?
ありがとうございます
int型の配列のソートも検索したのですがでてきませんでした・・・

Array.sort(player[2]);
としてしまうとplayer[2]だけがソートされてしまいplayer[0]やplayer[1]が一緒についてこないようなんです。
例えば
{{12,32,1},
{32,43,5},
{43,26,2},
{76,43,4},
{96,31,3}}
というような配列だったら
{{12,32,1},
{43,26,2},
{96,31,3},
{76,43,4},
{32,43,5}}
という風にソートしたいんです

たびたび申し訳ありませんがよろしくお願いします。
こーじさん、

Appletだったんですね。それなら基本ブラウザーでの動作になりますね。
あと、main()メソッドも無いということもあります。
ただ、Swingなら別ですよ。同じGUIでもJarファイルから立ち上がります。

配列をソートするのはArraysクラスのsort()メソッドですね。
sort()メソッドは ArrayではなくArraysクラスで、両者にてるので気をつけてください指でOK
ちょっと紛らわしいけどたらーっ(汗)

以下APIドキュメント
http://java.sun.com/javase/ja/6/docs/ja/api/index.html
こんな感じでしょうか・・・? 
200はコンソールに表示するが大変なので50にしてみました。

import java.util.*;
public class ArraysSort_test{

public static void main(String args[]){
int player[][] = new int [3][50];

//いちいち数字で50と書くのは微妙なのでlengthを使います。
for(int i = 0 ; i<player.length ; i++){
for(int j = 0 ; j < player[i].length ; j++){
player[i][j] = (int)(Math.random()*500);
}
}
//たぶんここの部分が問題だったかもしれないです。
for(int k = 0 ; k <player.length ; k++){
Arrays.sort(player[k]);
}
for(int i = 0 ; i<player.length ; i++){
for(int j = 0 ; j < player[i].length ; j++){
System.out.println(player[i][j] + ":");
}
System.out.println();
}
}
}
すみません。↑だと全部の配列が普通にソートされますね(汗
アプレットなら、アプレットビュアがmainですね。

ソートに関しては、playerをそのまま引数としてComparator内で比較する値を取り出しましょう。
参考のサイト真似ました。

import java.util.*;
public class Mixi {

 public static void main(String[] args) {
  int player[][] = new int [3][10];
  for(int i = 0; i < player[0].length; i++){
   player[0][i] = (int)(Math.random()*500);
   player[1][i] = (int)(Math.random()*600);
   player[2][i] = (int)(Math.random()*700);
  }
  
  System.out.println("初期値");
  dump(player);
  
  int index = 0;
  if(args.length != 0) {
   index = Integer.parseInt(args[0]);
  }
  // indexが配列の範囲内かチェックしてね
  
  Arrays.sort(player, new PlayerComparator(index));

  System.out.println("ソート後");
  dump(player);

 }
 
 private static void dump(int[][] player) {
  for(int i = 0; i < player.length; i++) {
   for(int j = 0; j < player[i].length; j++) {
    System.out.print(player[i][j]);
    if(j == player[i].length - 1) {
     System.out.println();
    } else {
     System.out.print(",");
    }
   }
  }
 }
}

import java.util.*;
public class PlayerComparator implements Comparator<int[]> {
 private int index = 0;
 
 public PlayerComparator(int index) {
  this.index = index;
 }
 
 public int compare(int[] o1, int[] o2) {
  return o1[index] - o2[index];
 }
}
すみません丁寧にソースまでいただいて大変恐縮なのですが、いまいち使い方がわかりません・・・orz

ご教授いただけたら嬉しいです
そのまま貼り付けてクラスファイルにするだけですが、なにかエラーでも出たんでしょうか。
まずはやってみてどうなったかを書かないと。
すみません
今手打ちで直したら動きました

あとは自分で出来ると思うのでやってみます!!

長々ありがとうございましたーー!
eclipse使ってます
TFIDFを実装しようとしています

HashSetやHashMapを用いてTFとDFをまとめようと思っているんですが
HashSetやHashMapをファイルに出力するにはどの様にしたらいいんですか??
> 944:ワキさんさん

何をファイルに出力したいかわかりませんが、インスタンスの状態をファイルに出力するならObjectOutputStream、文字列として出力するならBufferedWriterかと。
>りょーちんさん
返事ありがとうございます
HashSetに入ってる文字列を1行ずつファイルに出力したかったのです
> 996:ワキさんさん
BufferedWriter writer = new BufferedWriter(new FileWriter("出力ファイルパス"));
Iterator it = hashSet.iterator();
while(it.hasNext()){
String str = (String)it.next();
writer.write(str);
writer.write("\n");
}
writer.close();

この程度のことならここで質問するよりも、前回の私の回答をもとに自分で調べたほうが早いと思います。
>りょーちんさん
すいません
色々調べてたらできました
ありがとうございます
return books.get(index);



return(Book)books.get(index)

の違いって何なのでしょうか?

booksはArrayListです。

Iteratorというデザインパターンの勉強中に後者の文章が現れたのですが、

このような手法は見たことがありません。
本にも載っていません。

と、書きながら気づいたのですがこれはゼネリクスが使われていないArrayListの書き方なのでしょうか。

本ではbooksは
private ArrayList books;
と宣言されています。

僕は
private ArrayList<Book> books;
と宣言しました。

その違いが最初の二つの文のちがいということなのでしょうか?

ログインすると、残り969件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Java 更新情報

Javaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング