0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

文字列を変更するアルゴリズムを考える

0
Posted at

はじめに

故あってJava再び。
Javaは久しぶりのため思い出しも兼ねて文章化します。

要件

  • 以下の形式のデータを受け取る

String[]{"n","n1 n2 n3..."}

String型の配列
1番目の要素:先頭から数えてn番目の文字を表す
2番目の要素:スペースで区切られた文字列

  • 1番目の要素nを出力する
  • 配列の2番目の要素から1番目の要素を削除した文字列を出力する
入力
 {"2","あ い う え お"}
出力
2
あ う え お

何を作ったか

  • 一番目の要素nをInt型にする
java
int target = Integer.parseInt(str[0]);
  • 受け取った文字列をStringBuilder型にする
java
StringBuilder sb = new StringBuilder(str[1]); 
  • 新しく作成した文字列をString型にする
java
StringBuilder temp = new StringBuilder(""); 

String output = temp.toString(); 
  • 出力する文字列を作成するメソッド

完成したソースコード
Editout.java
public class Editout{
    
    // sbからtarget番目の値を削除した文字列を返す
    public String edit(String[] str){
        try{
            int target = Integer.parseInt(str[0]); 
        }catch(RuntimeException e){
            System.out.println("入力フォーマットエラー");
        }

        int target = Integer.parseInt(str[0]);                   // 一つ目の要素をint型に
        StringBuilder sb = new StringBuilder(str[1]);            // 編集する文字列をStringBuilder型に
        StringBuilder temp = new StringBuilder("");              // 返す文字列
        boolean mine = false;                                    // 削除する文字であればtrue

        final char key = ' ';                                    // mineを変更するキーワード

        // mineがfalseとなる文字列をtempに追加する
        for(int i = 0, count = 1; i < sb.length(); i++){        // count 何文字目か判定
            char point = sb.charAt(i);                          // 参照する文字

            // mineを変更
            if(count == target){mine = true;}
            if(count > target){mine = false;}

            // mineがfalseである文字をtempに追加
            if(!(mine)){
                temp = temp.append(point);
            }

            if(point == key){ count++; }                        // 参照した文字がkeyであれば次の文字と判定
        }
        String output = temp.toString();                        // tempをString型にして返す
        return output;
    }
 
}
テスト用ドライバ
EditoutTester.java
class EditoutTester{
    public static void main(String[] args){
        String[][] strs = {
            {"2","あ い う え お"},                      // [0]
            {"1","あ い う え お"},                      // [1]
            {"2","A B C D E F G"},                      // [2]
            {"10","1 2 3 4 5 6 7 8 9 10"}               // [3]
        };

        int i = 0;
        for(String[] str: strs){
            Editout editout = new Editout();

            System.out.println("[" + i++ + "]");
            System.out.println(str[0]);
            System.out.println(editout.edit(str));
        }
    }
}
実行結果
[0]
2
あ う え お
[1]
1
い う え お
[2]
2
A C D E F G
[3]
10
1 2 3 4 5 6 7 8 9

作成して考えたこと

なぜString型でデータを受け取るのか?
他の型に変換しなければならないString型でデータを受け取るのには以下のような理由があると考えました。

  • 文字列として受け取ることで入力値が変わってしまうことを避ける
  • 受け取る際の実行時例外を避ける
Copilotさんに聞いてみた

Java で String 型で受け取る理由 は、主に以下のような性質と設計思想によります。

  1. 入力は基本的に「文字列」として渡される
    コンソール入力(Scanner や BufferedReader)や Web フォーム、ファイル読み込みなど、多くの外部データは 文字列として取得 されます。
    例えば Scanner.nextLine() は常に String を返します。
    これは、入力が数値か文字かを判断する前に、まず「文字列」として受け取る方が安全だからです。
  2. String は汎用的で変換しやすい
    String で受け取れば、必要に応じて数値や日付などに変換できます。

最初から int や double で受け取ると、変換エラー時に例外が発生しやすく、柔軟性が下がります。
3. String は不変(Immutable)で安全
Java の String は immutable(不変) なので、受け取った後に勝手に内容が書き換わることがありません。
これにより、マルチスレッド環境やセキュリティ面で安全性が高まります。
4. ユーザー入力は必ずしも数値とは限らない
ユーザーが入力するのは、数字だけでなく文字や記号も含まれる可能性があります。
まず String で受け取り、バリデーション(検証)を行ってから型変換するのが一般的です。
まとめ
「まず文字列として受け取り、必要に応じて変換する」
これが Java で String 型を使う最大の理由です。

まとめ

気付いてなかった自分に愕然。。。
ですが考えることができたのでよい学習になりました。

ここまでお読みいただきありがとうございました。
間違い、認識違い等ありましたらご指摘いただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?