ここから質問投稿すると、最大4000ポイント当たる!!!! >>

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

5分遅れで同じ回答をしてしまった(^^;


ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。
    • good
    • 0
この回答へのお礼

皆さま本当にありがとうございました!
printf、非常に勉強になりました! Javaにこういうのがあったんですね^^すごく参考になりました!

お礼日時:2010/05/01 16:05

#1です



 プログラミングの学習等で固定ピッチだという前提があれば、スペースでの位置合わせというのは有効ですが、現実にアプリ等を作っていく上では通用しないことがあるということです。
 また、実用的なアプリの多くはGUI環境で作られますから、コンソールに文字を表示する感覚とは違ってきます。GUIの画面上で文字を表示するならAWT等を使って、

  g.drawString("文字列", x, y);

みたいなやり方で座標指定して文字を表示します。
 こういう方法を使えば、厳密に位置合わせができるというわけです。(表示の開始位置だけだけど)

 英単語の開始位置をx1、座標の開始位置をx2で揃え、縦の位置yを1行の幅ずつ増やしていけばきちっと揃った状態で表示できるようになるわけです。
    • good
    • 0

エクセル使えば早くない?

    • good
    • 1

固定ピッチ端末で使用することは大前提であるとして、


シンプルにやるのならC言語でおなじみの書式付き出力を利用する方法がある。

public static void main(String[] args) {
String[] word = {"apple", "orange", "dog", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
String format = "%-" + (word[0].length() + 15) + "s%s%n";
for (int i = 0; i < word.length; i++) System.out.printf(format, word[i], coord[i]);
}

printfメソッドが書式による出力を行うメソッドであり、
formatがその書式を定める文字列になる。
formatは上のサンプルであれば "%-20s%s%n" という文字列になる。
前半部の"%-20s"はprintfメソッドの書式文字列を除いた最初の引数、つまりword[i]に対する書式、
次の"%s"はその次の引数coord[i]に対する書式を表す。
最後の"%n"は改行を表す。
"%s"というのは丁度必要な幅を確保した文字列という意味であり、
"%20s"のようにすると20桁分の幅を確保し、その中で文字列は右寄せという意味になる。
"%-20s"のように"-"をつけることで左寄せの意味になる。
つまり、"%-20s%s%n"をprintfメソッドに与えることは、
20桁分の出力欄を確保してその欄の中で左寄せでword[i]を出力し、
その次の桁、つまり21桁目からcoord[i]を出力し、
最後に改行を出力することの意となる。

この書式文字列"%-20s%s%n"をプログラム自身が動的に作っているのが、
"%-" + (word[0].length() + 15) + "s%s%n"
の部分。

> 最初の単語(apple)で15個のスペースを置き座標を表示するので、以下の単語はそれにあわせて表示する

とのことなので、
(word[0].length() + 15)
はword配列の最初の要素"apple"の文字数を数え、
さらにスペース分の15を加えた20という値を計算し、
その前後に残りの書式文字列のパーツを足して、書式文字列としている。

ただし、上のサンプルでは解決の難しい問題、unicode文字の表示幅判定の問題を抱えている。
例えば、word[i]が英単語だけならいいが、どれかを漢字などのいわゆる全角文字にすると表示が崩れる。
文字種を限っていけば簡単な判定の方法があるがunicode全般での判定は難しい。
word[i]を普通の英単語に限るなら判定しなくて済むので一番簡単になる。
これは質問者の問題領域次第なので、とりあえず一番簡単でいいもの前提にした。
もう一つ、サンプルでは補助文字に対応していないが、
こちらも質問者の問題領域次第なのであまり気にしなくていいかもしれない。
文字数数えを
(word[0].codePointCount(0, word[0].length()) + 15)
にすれば補助文字に対応するが、文字幅判定の方が実用上は大きい問題なのであまり意味がない気がする。

printfメソッドの書式の仕様についてはjava.util.Formatterクラスの文書に詳細がある。
C言語のprintf関数について検索してみても参考になると思う。
特にサンプルは文字列前提だったが数値を出力したい場合などは自分で調べてほしい。

また、たとえば、座標を複数個の数値などを要素とする配列やコレクションで持っている時に、
一行に複数の座標を出力する場合は、書式付きでword[i]だけを先に出力して、
さらに座標を個数分出力した後、改行するなどすればいいと思う。
    • good
    • 0

すいません思い出しました。


printfをつかって簡単にできました。
main()のループの中身を↓に変えると簡単にできます。
System.out.printf("%-20s%s\n",words[i],coo[i]);
    • good
    • 0

もっと簡単な方法があった気もしますが、ぱっと思いついたのでとりあえず。



public static void main(String[] args){

String[] words = {"apple","orange","dog"};
String[] coo = {"(2,8) (3,6)","(3,7) (9,8) (2,10)","(3,0)"};

for(int i = 0; i < words.length;i++){

System.out.print( words[i] );
printSpace(words[i]);
System.out.println( coo[i] );
}
}

public static void printSpace(String word){

String space = " ";
for(int i = 0; i < 15 - word.length(); i++){
System.out.print(space);
}
}

こんな感じに英単語の長さにあわせて毎回ループでスペースを表示させれば上手くいく
と思います。
まぁもっといい方法があると思うので他の方のでいい方法があればそちらでお願いします^^;
    • good
    • 0

 どういう環境で動作するものなのかによって違ってくるので一概には言えませんが……



 とりあえず、一律に15個のスペースじゃ位置が揃わないのは理解されてますよね?

 MS-DOSマシンのような完全なフォントピッチ固定の環境ならスペースを調整することで位置を揃えることは出来ますが、昨今のPC環境はそんな単純なものではないので、たとえ固定ピッチのフォントを使ったとしてもスペースの幅が文字幅と違ったりするので、この方法は良いとは言えないでしょう。

 各行を行単位で一括に処理するのではなく、英単語の項目と座標の項目は分け、それぞれ独自に座標を指定して表示するのが適切な方法だと思われます。

この回答への補足

すみません、間違えました。すべての場合に15個分のスペースでは揃うわけないですよね・・・。
最初の単語(apple)で15個のスペースを置き座標を表示するので、以下の単語はそれにあわせて表示する、でした。

magicalpassさんの言うように、単語と座標をわけて表示するというのは、どのように書けばいいのでしょうか?

初めに英単語の表示で、
System.out.print("apple");
としたあとで
System.out.print("(2,8)");
System.out.print("(3,6)");
というように別けるということでしょうか?これだと単語の後すぐに座標が来てしまいやはり同じ結果になってしまいます。
すみません。どのように独自に指定して表示すればよいでしょうか?

補足日時:2010/04/30 05:17
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJAVAでの文字表示について

今、netBeansでプログラムを作成しています。
JAVAは初心者レベルです。

TextAreaにappendで配列等から文字を表示させたいのですが、
例えば、
**************
テレビ 10000円
ビデオデッキ   5000円
DVDプレイヤー 4000円
*************
のように表示させたいです。

テレビ、ビデオデッキなど文字数が違う物をC言語のprintfで10%sのように空白を表示させる方法はあるのでしょうか?
また、他の方法でも何か無いでしょうか?

くだらない質問で恐縮ですがよろしくお願いします。

Aベストアンサー

こんばんは。
標準で提供される機能を探しているようなので、参考にならないかもしれませんが、文字数を揃える処理は2行程度で実現できます。
ただ、文字コードがShift-JIS以外だとうまくいかない可能性もあります。
==================================================
import java.awt.*;
import javax.swing.*;

public class Test extends JFrame {

public static void main(String[] args) {
Test test = new Test();
test.setVisible(true);
}

// 右に空白を入れてサイズを揃える
public static String fixSize(String text, int size) {
int addSpaceNum = size - text.getBytes().length;
for(int i = 0; i < addSpaceNum; i++) text += " ";
return text;
}

// 左に空白を入れてサイズを揃える
public static String fixRight(String text, int size) {
int addSpaceNum = size - text.getBytes().length;
for(int i = 0; i < addSpaceNum; i++) text = " " + text;
return text;
}

public Test() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea = new JTextArea(30, 30);
textArea.setFont(new Font("MS ゴシック", Font.PLAIN, 12));
this.getContentPane().add(textArea, BorderLayout.CENTER);
this.setSize(400, 300);

String[] items = {"テレビ", "ビデオデッキ", "DVDプレイヤー"};
String[] prices = {"10000円", "5000円", "4000円"};
for(int i = 0; i < items.length; i++) {
textArea.append(Test.fixSize(items[i], 15)); // 商品名を半角15文字で揃える
textArea.append(Test.fixRight(prices[i], 15) + "\n"); // 金額を半角15文字右寄せで揃える
}
}

}

こんばんは。
標準で提供される機能を探しているようなので、参考にならないかもしれませんが、文字数を揃える処理は2行程度で実現できます。
ただ、文字コードがShift-JIS以外だとうまくいかない可能性もあります。
==================================================
import java.awt.*;
import javax.swing.*;

public class Test extends JFrame {

public static void main(String[] args) {
Test test = new Test();
test.setVisible(true);
}

// 右に空白を入れてサイズを揃える
public...続きを読む

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q九九の表

を作るプログラムなんですが結果がずれて表示されるんですがどうせればきれいにそろうんでしょうか??
いくらやっても上手くいきません・・・。
どなたかヒントもらえませんか。
\tを試して一応そろったんですがもっとコンパクトな表示結果にしたいんです。
プログラムはこんな感じです。
public class Kukuhyou3 {
public static void main(String[ ] args) {
int i,j,kekka;

System.out.println(" | 1 2 3 4 5 6 7 8 9");
System.out.println("--+----------------------------");

for(i = 1;i < 10;i++) {
System.out.print( " "+ i +"|");
for(j=1; j < 10; j++) {
kekka=i * j;
System.out.print(" "+kekka);
}
System.out.println("");
}
}
}

を作るプログラムなんですが結果がずれて表示されるんですがどうせればきれいにそろうんでしょうか??
いくらやっても上手くいきません・・・。
どなたかヒントもらえませんか。
\tを試して一応そろったんですがもっとコンパクトな表示結果にしたいんです。
プログラムはこんな感じです。
public class Kukuhyou3 {
public static void main(String[ ] args) {
int i,j,kekka;

System.out.println(" | 1 2 3 4 5 6 7 8 9");
System.out.println("--+----------------------------");

for...続きを読む

Aベストアンサー

2次元配列を使用してみました。目下、デザインパターンの勉強中で、tatsu99さんみたいに抽象化、再利用性の高いものはできないのですが、以下のソースなどを元にして、他人のプログラムを読み取る、という能力も同時に身に付けてもらえたら、と思います。

public class Kukuhyou3 {
public static void main(String[] args) {
int kuku [][] = new int[9][9];

System.out.println(" | 1 2 3 4 5 6 7 8 9");
System.out.println("--+----------------------------");

for(int i = 1;i < 10;i++) {
System.out.print( " "+ i +"|");
for(int j=1; j < 10; j++) {
// 答えが1桁の時のみ、前にも空白を入れます。
Figure blank = new Figure(10);
blank.judge(i,j);

kuku[i-1][j-1] =i * j;
System.out.print(" "+kuku[i-1][j-1]);
}
System.out.print("\n");
}
}
}

class Figure {
private int nbsp;

public Figure(int _nbsp){
this.nbsp = _nbsp;
}

public void judge(int i,int j){
if(i*j < nbsp) System.out.print(" ");
}
}

2次元配列を使用してみました。目下、デザインパターンの勉強中で、tatsu99さんみたいに抽象化、再利用性の高いものはできないのですが、以下のソースなどを元にして、他人のプログラムを読み取る、という能力も同時に身に付けてもらえたら、と思います。

public class Kukuhyou3 {
public static void main(String[] args) {
int kuku [][] = new int[9][9];

System.out.println(" | 1 2 3 4 5 6 7 8 9");
System.out.println("--+----------------------------");

for...続きを読む

QC言語のprintfで桁数をそろえる

次ので桁数をそろえると書いてあったけどやってみたらできなかった。
コンパイラはMS visual c++バージョンはおそらく7.1.3019

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a;

scanf("%d",&a);
printf("a=%3d\n",a);

return 0;
}

Aベストアンサー

特定の処理系に依存するものではないので、一般的な(ANSI C)規則でで書きます。

%3d は、「最低3桁まで出力する」という意味であって、4桁入力すれば
4桁になります。

32ビット int の範囲が -2147483648~2147483647 ですから、
%10d にして、最大の10桁まで表示するようにすればそろいます。

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Q文字列をタブ区切りで出力したい

HTMLファイルをタグごとに区切って、value属性を持つものには、value=""のダブルクオートの
中に文字列を入れて、以下のように出力させたいと思っています。


<html>
<body>
<input type="text" name="name" value="出力させたい値">
</body>
</html>


そのため、以下のクラスを作成しました。

public class Sample {

private static final String findValue = "value=\"";
private static final int valueLen = findValue.length();

public static void main(String[] args) {

String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

StringBuffer sb = new StringBuffer(html);
int tagStart = sb.indexOf("<");
int tagEnd = sb.indexOf(">") + 1;
if (tagStart >= 0 && tagEnd > 0) {
String tag = sb.substring(tagStart, tagEnd);
System.out.println("tag : " + tag);
int valueIndex = tag.indexOf(findValue) + valueLen;// パラメータ挿入開始位置

if (valueIndex > valueLen) {
String tagLeft = tag.substring(0, valueIndex);
String tagRight = tag.substring(valueIndex, tag.length());
String ret = null;

ret = tagLeft + "あああ" + tagRight;

System.out.println("ret : " + ret);
}

}

}

}

しかしこの処理だと最初のタグしか読んでくれず、次のタグの呼び出し方が思い浮かびません。
どなたかご助言をお願いいたします。

HTMLファイルをタグごとに区切って、value属性を持つものには、value=""のダブルクオートの
中に文字列を入れて、以下のように出力させたいと思っています。


<html>
<body>
<input type="text" name="name" value="出力させたい値">
</body>
</html>


そのため、以下のクラスを作成しました。

public class Sample {

private static final String findValue = "value=\"";
private static final int valueLen = findValue.length();

public static void main(String[] args) {

String ...続きを読む

Aベストアンサー

//1つの方法
public static void main(String[] args) {
String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

int tagStart = 0;
int tagEnd = 0;

while(true){
tagStart = html.indexOf("<", tagEnd);
if(tagStart == -1) break;
tagEnd = html.indexOf(">", tagStart + 1) + 1;
if(tagEnd == 0) break;
String tag = html.substring(tagStart, tagEnd);
String rep = tag.replace("value=\"\"","value=\"あああ\"");
// System.out.println("tag : " + tag);
System.out.println("rep : " + rep);
}
}

//1つの方法
public static void main(String[] args) {
String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

int tagStart = 0;
int tagEnd = 0;

while(true){
tagStart = html.indexOf("<", tagEnd);
if(tagStart == -1) break;
tagEnd = html.indexOf(">", tagStart + 1) + 1;
if(tagEnd == 0) break;
String tag = html.substring(tagStart, tagEnd);
String rep = tag.r...続きを読む

Qコマンドプロンプト内で右揃え表示がしたい!

Javaをはじめたばかりの者です。
現在、二乗・三乗を計算して簡単な表の様に表示されるプログラムを作っています。コマンドプロンプトで、
1 1 1
2 4 8
3 9 27
4 16 64
という様に表示されるのですが、これを
1 1 1
2 4 8
3 9 27
4 16 64
という風に表示したいのです。(ここでは綺麗に表示されていませんが、要は右揃えにしたいのです。)

ただし、桁が大きくなっても計算できるプログラムでないとダメなので、1つずつSystem.out.print(" ");を二乗と三乗の間に挟んで書くのはNGです。

また、format?print?(←これはアプレットの時の話なのでしょうか?今回の事に関係あるのかわかっていません…)もNGという制約があります。

他に、何か方法はあるのでしょうか?
イメージとしては、数字が何桁なら(=1~9、10~99など指定?)スペースを1つ加える、みたいな決まりごとを作る書き方が思いつくんですが…

そんな記述法はあるのでしょうか?

お知恵拝借させて下さい。

Javaをはじめたばかりの者です。
現在、二乗・三乗を計算して簡単な表の様に表示されるプログラムを作っています。コマンドプロンプトで、
1 1 1
2 4 8
3 9 27
4 16 64
という様に表示されるのですが、これを
1 1 1
2 4 8
3 9 27
4 16 64
という風に表示したいのです。(ここでは綺麗に表示されていませんが、要は右揃えにしたいのです。)

ただし、桁が大きくなっても計算できるプログラムでないとダメなので、1つずつSystem.out.print(" ");を二乗と三乗の間に挟んで書くのはNGです。

...続きを読む

Aベストアンサー

↓でどうでしょうか?かなりベタですけど。(コンパイル、動作未確認です。)
計算結果:1乗、2乗、3乗の計算結果
桁数:何桁にあわせるか
private String スペース前埋め(int 計算結果,int 桁数){
  StringBuffer rtn = new String(String.valueOf(計算結果));
  
  for(int i = 0;i <= 桁数;i++){
    rtn.insert(0," ");
  }
  
  return rtn.substring(rtn.length()-(桁数+1),rtn.length());
}
java 1.5以降ならStringBuilder
全角スペースでインデントつけてます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング