Home > Java Archive
Java Archive
Javaで入出力の文字コード
- 2009-02-24 (火)
- Java
なんかFileOutputStreamとかで適当に出力したら、UTF-8で読み込んだはずなのにSJISになった。
「なんじゃこりゃ」と思ったら、デフォルトエンコーディングとかいうのがWindowsだとSJIS(MS932)になるらしい。なんというふざけた言語か。
実はFileOutputStreamしてるのはライブラリの中なのでいじるのはめんどくさいし、どうしたらいいのかといろいろ調べた結果、VM引数で
-Dfile.encoding=UTF-8
とすれば良いことが分かった。
Eclipseでデバッグするときは、実行のダイアログのVM引数に上のを書いておけばいい。なんか「変数」とかいうボタンでsystem_property:file.encodingとかを指定できるがうまくいかなかった。なんなんだろう、あれは。
以上
- Comments: 0
- Trackbacks: 0
ソートソーターソーテスト
ソートを考えてみる。
C:
#include <stdlib .h>
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
まあ、以上だな。最後の引数で比較関数へのポインタを渡してあげれば(人間)万事(塞翁が馬)OKだ。
C++:
#include <algorithm>
void std::sort(RanIt first, RanIt last, BinPred pr);
まあ、STL使いましょうやってことでな。最後のprはなくてもいいが、比較関数を自分で用意する場合に渡してあげれば(人間)(略)。
たとえばvectorをソートするには下記のようにする。
#include <algorithm>
struct cmp {
bool operator()(int a, int b) const {
return b > a; // 昇順ソート
// return a > b; 降順ソート
}
};
int main() {
std::vector< int > a;
a.push_back(10);
a.push_back(2);
a.push_back(5);
std::sort(a.begin(), a.end(), cmp());
for(int i = 0; i < a.size(); i++) {
printf("%d\n",a[i]);
}
}
なんかしらんが、operator()をオーバーロードしたクラスを作ってインスタンスをstd::sortに渡せばいいらしい。ちなみにoperator()をオーバーロードしたクラスを関数オブジェクトって言うらしい。関数のオブジェクトだな。インスタンス名()みたいな使い方できるからな。
なんでboolなのか、なんであれで昇順なのかはしらん。
たぶん、strcmpみたいなんと同じような理屈で結果を解釈して、大きいほうの引数を後ろに配置するんだろう。関数ポインタでもいいらしい。
std::vector< char * >
みたいな場合は
struct cmp {
bool operator()(const char *a, const char *b) const {
for (int i = 0; a[i] != '\\0' && b[i] != '\\0'; i++) {
if (a[i] != b[i]) {
return b[i] > a[i];
}
}
if (a[i] == '\\0' && b[i] != '\\0') {
return true;
}
return false;
};
みたいな感じでいいんじゃないかと思った。
Perl:
@array = sort @array;
まあ、こんな感じ。比較関数を定義したい場合は、
@array = sort { $a cmp $b } @array;
見たいな感じ。
{ }の中が-1なら$aを前に、1なら$bを前にするということらしい。
→http://www.uopmu.ees.osakafu-u.ac.jp/~yabu/soft/perl.html
がとっても参考になる。今まで雰囲気で使ってた。
そういうわけで、[C++]のやつと同じような考え方でよさげ。
$aと$bは予約語みたいなもんなのか?
Java:
配列なら
Arrays.sort()
コレクションなら
Collections.sort()
まあ、これはJavadocあるし、こまるこたぁないだろう。
Comparatorを作れば好きなように比較できる
キーワード:
クイックソート,quick,sort,ファンクタ,アルゴリズム,演算子,ソート,sort,list,コンテナ,アダプタ
- Comments: 0
- Trackbacks: 1
Swingフォーエバー
- 2006-10-15 (日)
- Java
Swingはシングルスレッドモデルなので、
他のスレッドからSwingコンポーネントをいじってはいけない。
「でも、いじりたい時だってあるのよ!」って奥さん!
そんなあなたにはこれ!「SwingUtility#invokeLater()」。
適切に判断してくれます。
キーワード:
Java,マルチスレッド,シンクロ,同期,synchronize,他のスレッド,別スレッド,javax
- Comments: 0
- Trackbacks: 0
Home > Java Archive
- Search
- Feeds
- Meta
- 合計:160872
今日:0102 昨日:0397