Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

00001など0を省略させずに表示させる方法

5桁の数字 "00000"〜"99999" を順番に出力するプログラムをなんとか下記のように作成しました。ifなどの条件分岐を使わずに作ることは可能でしょうか?
public class EnsyuA {
public static void main(String[] args) {
int sum = 0, i = 0;
while(i < 99999) {
sum = sum +1; 
i++;

if(0 <= sum && sum<= 9) {
System.out.println("0"+"0"+"0"+"0"+sum);
}
if(10 <= sum && sum<= 99) {
System.out.println("0"+"0"+"0"+sum);

if(100 <= sum && sum<= 999) {
System.out.println("0"+"0"+sum); 
}
if(1000 <= sum && sum<= 9999) {
System.out.println("0"+sum);
}
if(10000 <= sum && sum<= 99999) {
System.out.println(sum);
}
}
}

19

回答

80827

閲覧

19件の回答

評価

0

Java のコアライブラリだけを使う事を前提とするなら、パディングメソッドとかを作ってそれを出力時に毎回呼び出せば良いかと思います。

評価

0

DecimalNumberFormat あたりではいかがでしょうか。

評価

0

>可能でしょうか?

可能です。

ヒントというか答え?
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

評価

0

しまった

こっち!!
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/text/DecimalFormat.html

評価

0

皆さんご回答いただきどうも有難うございました。

評価

0

むむ。
DecimalFormat ありましたね、そういえば。
私の馬鹿さ加減を露呈してしまいました・・・
myu さん、私の最初の回答は忘れて下さい。

評価

0

以前APIにあるのを知らずに、
コーディングしたことがありますが、
結構よかったので・・・一応参考に

for (int i = 0; i < 10000; i++) {
  String str = "00000" + i;
  System.out.println(str.substring(str.length() -5));
}

数値の前に"00000"を付けて文字列にし、
後ろから5個分とります。

評価

0

まだ出てないようなので、これもどうぞ。
System.out.printf("%05d\n", i);

JDK1.5からですが・・

評価

0

Java5.0以降ならprintfも使えます

for(int i = 0; i < 100000; i++){
   System.out.printf("%05d\n", i);
}

評価

0

かぶったorz

こんな使い方もできます・・・

for(int i = 0; i < 100000; i++){
   String a = String.format("%05d",i);
   System.out.println(a);
}

評価

0

色んな使い方があって面白いですね。青森さん、たまさん、適当さんに教えていただいたものがわかりやすかったです。DecimalNumberFormatは使い方がまだよくわかりませんが、がんばって理解していきたいと思います。皆さん親切に教えていただきどうも有難うございます。

評価

0

printf系のメソッドで改行する場合、%nを使うとプラットフォーム固有の行区切り文字が出力されます。
詳しくは
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Formatter.html#dls
を参考にしてください。

評価

0

hogeぽんさん
>%nを使うとプラットフォーム固有の
なるほどー、これは知りませんでした参考にさせていただきます。

評価

0

余談ですが、format系は解析と置換が発生する以上、ある程度重い処理になります。

println()は、元々プラットフォームの改行コードを出してくれます。
もっとも、アプリ全体からすれば、どう作っても大した違いではないでしょう。

改行コードはSystem.getProperty("line.separator")で取得できます(println()なんかも中で使いまわしてます)。

評価

0

Cでリアルタイムな処理が必要なときにsprintfを使わずに、memcpyを使っていたのを思い出しますね。

多分ここに出てきた中で一番早いのは青森さんの方法かなー。
あ、忘れてたmyuさんの最初ので余分な+を取り除けば早そう。

評価

0

最初のを採用して(実際こういうロジックになるケースもあります)、あえて改良するとすれば、

>while(i < 99999) {
>sum = sum +1; 
>i++;
for (int i = 0; i < 100000; i++) {

sumはもともと、合計値を出そうとしていたのでしょうか?名前からすると。
しかしこの場合iと同じ値にしかなっていないので、あるだけ無駄です。

>System.out.println("0"+"0"+"0"+"0"+sum);
System.out.println("0000" + i);

>}
>if(10 <= sum && sum<= 99) {
else if (i <= 99) {(以下同じ)


余談になりますが、合計値を出すならわざわざループ中に足していくまでもなく、ループ後に

long sum = 99999L * (99999L + 1) / 2;

で良いでしょう。

評価

0

実験してみました、我ながら暇ですな。
なんかの足しにはなるでしょう。

1.DecimalFormat("00000")
422msec

2.String.format("%05d",i)
1563msec

3.substring(str.length() -5)
109msec

4.mioさん改造版
78msec

各5回平均値、出力せず代入のみです
マシン性能によるのと、ばらつきはありますが相対値として。

まあ、やっていることを考えれば妥当な線ですかね。

評価

0

mioさんの式は「ガウスの計算式」ですね。

小学校の時にこの式を思いついたというガウス君に驚きの式ですが・・・・。

tamaさんの実験結果をみて勉強になりました。(そんな順番になりそうだなぁとは思うけど、自分ではやらない人(笑)

ただ、DecimalFormatはもう少しパフォーマンス良いと思ったんですけどね。驚きです。

評価

0

if文羅列は一番高速とはいえ、最大値の桁の数だけif文を書かねばならないわけで、時計のように2桁しかあり得ないようなものでしか使いません。
現実的には、「分かりやすさ」でDecimalFormatが良いと思います。
CやVBでは、substring式でやることが多かったですね(あくまで私は)。


関係ないけど、

x^2 + 2x + 1 = (x + 1)(x + 1)

は小学校のとき気づきました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。