質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3795閲覧

[Java]¥tで揃わない箇所の揃え方

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2021/07/05 03:51

前提・実現したいこと

出力のidという文字を揃えたいのですが¥tでやってもうまくいかなかったのでどなたかアイデアある方助言をお願いしたいです。いじる箇所はTshirtクラスのtoStringでお願いしたいです。

発生している問題・エラーメッセージ

Tshirt [name=ハイクオリティーTシャツ, id=am5032 price=1210, maker=United Athle] Tshirt [name=プレミアムTシャツ, id=am5034 price=1870, maker=United Athle] Tshirt [name=メリノウールTシャツ, id=am5720 price=5000, maker=Sheep Run]

該当のソースコード

Java

1package exer5; 2 3import java.util.LinkedList; 4import java.util.List; 5 6public class Exer25_1 { 7 public static void main(String[] args) { 8 List<Tshirt> t=new LinkedList<>(); 9 t.add(new Tshirt("クルーネックTシャツ","am1021",4455,"nano・universe")); 10 t.add(new Tshirt("マックスプレス","am2033",3250,"MONOVO")); 11 t.add(new Tshirt("ハイクオリティーTシャツ","am5032",1210,"United Athle")); 12 t.add(new Tshirt("プレミアムTシャツ","am5034",1870,"United Athle")); 13 t.add(new Tshirt("ビーフィーTシャツ","am2589",3190,"Hanes")); 14 t.add(new Tshirt("ビーフィークルーネックTシャツ","am2593",2750,"Hanes")); 15 t.add(new Tshirt("メリノウールTシャツ","am5720",5000,"Sheep Run")); 16 t.add(new Tshirt("ベーシックTシャツ","am4604",1995,"Champion")); 17 18 t.stream() 19 .filter(tl->tl.getId().contains("am5")) 20 .forEach(System.out::println); 21 } 22 23} 24
package exer5; public class Tshirt { private String name; // 製品名 private String id; // ID番号 private int price; // 価格 private String maker; // メーカー public Tshirt(String name, String id, int price, String maker) { super(); this.name = name; this.id = id; this.price = price; this.maker = maker; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getMaker() { return maker; } public void setMaker(String maker) { this.maker = maker; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Tshirt other = (Tshirt) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @Override public String toString() { return "Tshirt [name=" + name + ", \t id=" + id + "\nprice=" + price +",\tmaker=" + maker + "]"; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Luice

2021/07/05 04:10

nameの文字数次第でズレ幅が変わってくる為、toStringで解決するのは無理だと思います。 代替案としては... - nameより先にidを表示する - nameを規定の文字数でtrimする などが考えられます。
guest

回答2

0

ベストアンサー

前提
tabは使っていません。
UTF-8で2byteだが 半角分の幅 の文字(例:° [C2B0])は考慮していません
絵文字は考慮していません
UTF-8で 1byteだが幅は全角 (例:\[5C])は ずれてないように見えますが 特別考慮はしていません。
全ての文字で試していません。

VScodeで試していますが、ターミナルの設定なのか ↓の例では表示がずれていますが、
t.add(new Tshirt("±¨×÷¢§ΔΞΩфж 2byte UTF-8","am4933",1921,"Champion C")); //UTF-8で 2byte
ターミナルの結果をコピペしてエディターに表示されたところではずれは確認できませんでした。

処理概要
変数nameをビットパターンの配列に変換し1byte文字 か2~4byte文字かを判定し、半角の数と全角の数を調査。
String.formatが参考にするname.length()の値と実際の文字幅とのずれを調整してString.formatで出力

Java

1 public String toString() { 2 int len_col_name = 40; //name 半角での長さ 3 //int len_col_id = 10; 4 int len_col_price = 10; //price 半角での長さ 5 // int len_col_maker = 16; //name 半角での長さ 6 int lenStr=0; //name出力時の調整済み出力幅 初期化 7 try { 8 byte[] array_by = name.getBytes(Charset.forName("UTF-8")); // nameをバイトシーケンスに変換し配列に格納 9 int num_1=0,num_2=0,num_3=0,num_4=0; //name中の 1~4byteの各文字の個数 10 // 現状では 1byte文字(半角)の個数 と24byte(全角 例外あり)の個数がわかればいい 11 // num_3,num_4はnum_2にまとめてもいい 12 for(int i = 0; i < array_by.length ;) { 13 String tmpstr = Integer.toBinaryString(Byte.toUnsignedInt(array_by[i])); 14 tmpstr = String.format("%8s", tmpstr).replace(" ", "0") ; //バイト毎に2進数表示した文字列 15 // 参考URL: http://exlight.net/devel/unicode/utf8.html 16 // 先頭ビットパターンで何バイト文字か判定 17 if (tmpstr.substring(0, 1).equals("0") ){i++;num_1++;} //1byte文字 18 else if (tmpstr.substring(0, 3).equals("110") ){i +=2;num_2++;} //2byte文字 19 else if (tmpstr.substring(0, 4).equals("1110") ){i +=3;num_3++;} //3byte文字 20 else if (tmpstr.substring(0, 5).equals("11110") ){i +=4;num_4++;} //4byte文字 21 else { System.out.println("例外文字" + tmpstr); i++;num_1++;} //例外throw処理入れたほうがいいかも 22 } 23 24 lenStr = len_col_name - (num_1+2*(num_2+num_3+num_4) - name.length() ); 25 } catch (IllegalCharsetNameException e) { 26 e.printStackTrace(); 27 } 28 //name priceの後ろに,を入れたい為、一時変数に代入 29 String tmp_name = name + ","; 30 String tmp_price = price + ","; 31 32 return "Tshirt [name=" + String.format("%-"+ lenStr + "s" , tmp_name) + "id=" + id + "\n" + 33 "price=" + String.format("%-" + len_col_price + "s",tmp_price) + "maker=" + maker +"]"; 34 } 35

テスト用サンプルデータ

Java

1 t.add(new Tshirt("\\\1byte UTF-8 zenkaku","am4625",1005,"Champion AA")); //UTF-8で 1byteだが幅は全角 2 t.add(new Tshirt("ABCMART abc def","am4644",1095,"Champion B")); //1byte 3 t.add(new Tshirt("±¨×÷¢§ΔΞΩфж 2byte UTF-8","am4933",1921,"Champion C")); //UTF-8で 2byte 4 t.add(new Tshirt("あいうえおアイウエオ 3byte UTF-8","am4604",1975,"Champion D")); // UTF-8で 3byte 5 t.add(new Tshirt("???????????????????????????????????? 4byte UTF-8","am4943",1695,"Champion F")); // UTF-8で 4byte 6 t.add(new Tshirt("ABC ±± ベベベ ????????????????","am4901",1322,"Champion H")); //混在 7 t.add(new Tshirt("°°° 2byte UTF-8 hankaku","am4624",1995,"Champion A")); //UTF-8で2byteだが 半角分の幅 ずれます 8 t.add(new Tshirt("???????????????????????? 4byte UTF-8","am4999",1922,"Champion G")); //絵文字ずれますUTF-8で 4byte

結果
(コピペして等倍フォントで表示させれば揃うと思います)

Tshirt [name=クルーネックTシャツ, id=am1021 price=4455, maker=nano・universe] Tshirt [name=マックスプレス, id=am2033 price=3250, maker=MONOVO] Tshirt [name=ハイクオリティーTシャツ, id=am5032 price=1210, maker=United Athle] Tshirt [name=プレミアムTシャツ, id=am5034 price=1870, maker=United Athle] Tshirt [name=ビーフィーTシャツ, id=am2589 price=3190, maker=Hanes] Tshirt [name=ビーフィークルーネックTシャツ, id=am2593 price=2750, maker=Hanes] Tshirt [name=メリノウールTシャツ, id=am5720 price=5000, maker=Sheep Run] Tshirt [name=ベーシックTシャツ, id=am4604 price=1995, maker=Champion] Tshirt [name=\\\1byte UTF-8 zenkaku, id=am4625 price=1005, maker=Champion AA] Tshirt [name=ABCMART abc def, id=am4644 price=1095, maker=Champion B] Tshirt [name=±¨×÷¢§ΔΞΩфж 2byte UTF-8, id=am4933 price=1921, maker=Champion C] Tshirt [name=あいうえおアイウエオ 3byte UTF-8, id=am4604 price=1975, maker=Champion D] Tshirt [name=???????????????????????????????????? 4byte UTF-8, id=am4943 price=1695, maker=Champion F] Tshirt [name=ABC ±± ベベベ ????????????????, id=am4901 price=1322, maker=Champion H] Tshirt [name=°°° 2byte UTF-8 hankaku, id=am4624 price=1995, maker=Champion A] Tshirt [name=???????????????????????? 4byte UTF-8, id=am4999 price=1922, maker=Champion G]

参考サイト
[Java]半角・全角混合でも文字位置を合わせる https://qiita.com/gsy0911/items/00876d8c61ce36bd5fba
※UTF-8 3バイト文字限定であれば、これでも対応可能

UTF-8 ビットパターン
http://exlight.net/devel/unicode/utf8.html

Unicode対応 文字コード表
http://ash.jp/code/unitbl21.htm

投稿2021/07/06 04:00

Crimson_Tide

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

表示するフォントをプロポーショナルフォントではないやつ(例えばMSゴシック)に変えてやってみよう

投稿2021/07/05 04:03

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/05 04:14

できました!ありがとうございます!
y_waiwai

2021/07/05 04:42

プロポーショナルフォントってのは文字ごとに幅が違うフォントなんで、そういう文字操作でアタマを揃えるってのは不可能かと思います
dodox86

2021/07/05 04:55

等幅フォントにすることで何が解決したのかどうも良く分からないですね。nameの文字数がそれぞれ違うが、コンソールなどへの出力時にid部分の頭を揃えたかった、というのではなかったのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問