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

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

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

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

Q&A

解決済

5回答

5707閲覧

javaで、与えられた3つの文字数ごとに取り出して改行区切で表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/08/21 04:54

javaで、ABCDEFGHIJという文字列を与えられた3つの文字数ごとに取り出して改行して表示したいです。例えば、1,1,8と与えられたら
A
B
CDEFGHIJ
という感じです。

3つの数字は
Scanner sc = new Scanner(System.in);
int h_1=sc.nextInt();
int h_2=sc.nextInt();
int h_3=sc.nextInt();
で与えられます。

[試してみたソースコード]

Java

1import java.util.*; 2 3 4public class Main { 5public static void main(String[] args) { 6 7 8Scanner sc = new Scanner(System.in); 9String S = "ABCDEFGHIJ"; 10int h_1 = sc.nextInt(); 11int h_2 = sc.nextInt(); 12int h_3 = sc.nextInt(); 13 14System.out.println(S.substring(0,h_1)); 15System.out.println(S.substring(h_1,h_2)); 16System.out.println(S.substring(h_2)); 17 18 19} 20} 21

[例と出力結果]
h_1=1,h_2=1,h_3=8の場合
A
BCDEFGH

h_1=3,h_2=4,h_3=3の場合
ABC
D
EFGHIJ

真ん中のsubstringの終わりに1を足してみたり2を足してみたり調節しても、必ず違う組み合わせで変な出力結果が出てしまいます。
どうすればきれいに出力できますか?
コードを実行しているのはpaiza.ioです。

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

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

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

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

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

jun68ykt

2018/08/21 05:04

こんにちは。回答ではないのでこちらに書きます。h_1, h_2, h_3 というのは文字数を表す変数ですが、 substring に与えるパラメータは文字数ではないです。例えば次のページ http://syunpon-java.com/programing/java/sample/substring.shtml を読んで、substring に与えるべきパラメータを見直すとよいと思います。
guest

回答5

0

ベストアンサー

String#substringの引数の与え方を確認しましょう。

この文字列の部分文字列である文字列を返します。 部分文字列は、指定されたbeginIndexから始まり、インデックスendIndex - 1にある文字までです。 したがって、部分文字列の長さはendIndex-beginIndexになります。

つまり、例えば入力が 1, 1, 8 のときは、次のように切り抜かねばならないのです。

ABCDEFGHIJ 0123456789 ← インデックス S.substring(0, 1) → A S.substring(1, 2) → B S.substring(2) → CDEFGHIJ

これを自動化するには、次のように入力を受け取れば良いでしょう。

Java

1int h_1 = sc.nextInt(); 2int h_2 = h_1 + sc.nextInt(); 3int h_3 = h_2 + sc.nextInt();

投稿2018/08/21 05:02

LouiS0616

総合スコア35660

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

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

0

こういう手法もあるよという趣旨の回答です。

Java

1import java.util.Scanner; 2import java.util.regex.Matcher; 3import java.util.regex.Pattern; 4 5public class A142232 { 6 7 public static void main(String[] args) { 8 Scanner sc = new Scanner(System.in); 9 int h_1 = sc.nextInt(); 10 int h_2 = sc.nextInt(); 11 int h_3 = sc.nextInt(); 12 final String S = "ABCDEFGHIJ"; 13 final String pattern = "(.{" + h_1 + "})(.{" + h_2 + "})(.{" + h_3 + "})"; 14 final Matcher m = Pattern.compile(pattern).matcher(S); 15 System.out.println(pattern); // (.{1})(.{1})(.{8}) 16 while (m.find()) { 17 // 全体にマッチするので1オリジンに 18 for (int i = 1; i <= m.groupCount(); i++) { 19 System.out.println(m.group(i)); 20 } 21 } 22 } 23}

◆参考情報
パターン内の括弧毎にマッチした部分文字列を取得

投稿2018/08/21 05:57

編集2018/08/21 06:00
umyu

総合スコア5846

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

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

0

subString(開始点, 終了点)なので、

[例と出力結果]
h_1=1,h_2=1,h_3=8の場合
A ⇐0から1まで(Aの左からAの右まで)
⇐1から1まで(Aの右からAの右まで)つまりAとBの間を表示 = Null。
BCDEFGH ⇐1から最後まで(Aの右から最後まで)

h_1=3,h_2=4,h_3=3の場合
ABC ⇐0から3まで(Aの左からCの右まで)
D ⇐3から4まで(Cの左からDの右まで)
EFGHIJ ⇐4から最後まで(Dの右から最後まで)

という実行結果になっています。
期待通りの動作をするには、

java

1System.out.println(S.substring(0,h_1)); 2System.out.println(S.substring(h_1,h_1 + h_2)); 3System.out.println(S.substring(h_1 + h_2));

でうまくいくと思います。

投稿2018/08/21 05:07

編集2018/08/21 05:12
yukihisa

総合スコア672

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

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

0

Java

1import java.util.Scanner; 2 3class Main { 4 public static void main(String[] args) { 5 6 Scanner sc = new Scanner(System.in); 7 String S = "ABCDEFGHIJ"; 8 int h_1 = sc.nextInt(); 9 int h_2 = sc.nextInt(); 10 int h_3 = sc.nextInt(); 11 12 System.out.println(S.substring(0, h_1)); 13 System.out.println(S.substring(h_1, h_1 + h_2)); 14 System.out.println(S.substring(h_1 + h_2, h_1 + h_2 + h_3)); 15 } 16}

もう少しきれいに書ける気もしますが…
Substringの開始地点が前回終了地点から始まる事を考えてやればいいのではないでしょうか。

投稿2018/08/21 05:03

terrace

総合スコア249

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

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

terrace

2018/08/21 05:05

LouiS0616さんの方が綺麗なコードと解説ですのでそちらを参照して下さい。
guest

0

substring をつかわずに書いてみました。

java

1import java.util.ArrayList; 2import java.util.List; 3import java.util.Scanner; 4 5public class MainXX { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 String str = "ABCDEFGHIJ"; 9 10 List<Integer> list = new ArrayList<Integer>(); 11 System.out.println("各行の長さを指定してください。(0以下を入力したら終了)"); 12 for (;;) { 13 int n = sc.nextInt(); 14 if (n < 1) { 15 break; 16 } 17 list.add(n); 18 } 19 20 int out_len = 0; 21 for (char ch : str.toCharArray()) { 22 System.out.print(ch); 23 out_len++; 24 if (!list.isEmpty() && out_len == list.get(0)) { 25 System.out.print("\n"); 26 list.remove(0); 27 out_len = 0; 28 } 29 } 30 System.out.print("\n"); 31 } 32}

実行例
イメージ説明

一文字ずつ Sytem.out.print() します。指定された文字数を出力したら、"\n" を出力します。

投稿2018/08/21 13:02

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問