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

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

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

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

Q&A

解決済

2回答

250閲覧

append の実装の仕方が分かりません

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/07/22 08:33

前提・実現したいこと

MStringObj の #append を実装したいのですが、以下のエラーが発生します。

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

MStringObj.java:42: エラー: ']'がありません String str = char[i] + s; ^ MStringObj.java:42: エラー: ';'がありません String str = char[i] + s; ^ MStringObj.java:42: エラー: 文ではありません String str = char[i] + s; ^ エラー3個

該当のソースコード(MStringObj)

Java

1public class MStringObj implements MString { 2 3 private char[] chars; 4 5 public MStringObj(char[] chars) { 6 if (chars == null) { 7 throw new IllegalArgumentException(); 8 } 9 10 this.chars = chars; 11 } 12 13 public MStringObj() { 14 this.chars = new char[0]; 15 } 16 17 public int length() { 18 return this.chars.length; 19 } 20 21 public boolean contains(char c) { 22 for (int i = 0; i < chars.length; i++) { 23 if (chars[i] == c) { 24 return true; 25 } 26 } 27 return false; 28 } 29 30 public int count(char c) { 31 int x = 0; 32 for (int i = 0; i < chars.length; i++) { 33 if (chars[i] == c) { 34 x++; 35 } 36 return x; 37 } 38 } 39 40 public MString append(MString s) { 41 for (int i = 0; i < chars.length; i++) { 42 String str = char[i] + s; 43 return new MStringObj(str); 44 } 45 } 46 47}

補足情報

よろしくお願い致します。

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

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

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

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

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

m.ts10806

2018/07/22 09:06

インデントの階層が合っていない箇所が散見されるので合わせておいてください。
退会済みユーザー

退会済みユーザー

2018/07/22 10:23

ありがとうございます。ペーストする時にずれてしまいました。気を付けます。
m.ts10806

2018/07/22 10:37

質問は編集可能なので適宜対応してください
guest

回答2

0

ベストアンサー

宗教上の理由がなければ、Stringクラスを正しく実装するのは相当困難(特にHashDoS対策)なため自作しないほうが良いです。
y_waiwaiさんが指摘している以外にこの2行だけで3つ間違えてます。

Java

1String str = char[i] + s; 2return new MStringObj(str);

1, sの方はMStringですが、Javaには演算子オーバーロードが無いので不正な記述です。

Java

1char[i] + s;

2, MStringの型を互換性のないString型に代入しようとしています。

Java

1String str =

3, MStringObjはコンストラクタはchar配列を受け付けます。Stringクラスは受け入れません。

Java

1public MStringObj(char[] chars) {

それとは別のバグですがforループ内の1回目でreturnしているので、1文字目で処理が終わります。


MStringObj#appendの仕様がよく分かりませんが。
文字列の末尾に追加したいのなら(未テストコード)

Java

1 public MStringObj(char[] chars) { 2 if (chars == null) { 3 // ※引数がnullなのにNullPointerException を発生させるのではなく、IllegalArgumentExceptionを発生させるのはAPIとしてどうなのでしょうか。 4 throw new IllegalArgumentException(); 5 } 6 this.chars = chars.clone(); // 防御的コピー 7     // もしくは Arrays.copyOfを使った形でも。 8 this.chars = Arrays.copyOf(chars,chars.length); 9 } 10 public char[] toCharArray() { 11 return this.chars.clone(); // 防御的コピー 12 } 13 public MString append(MString s) { 14 char[] rhs = s.toCharArray(); 15 char[] dst = new char[this.chars.length + rhs.length]; 16 System.arraycopy(this.chars, 0, dst, 0, this.chars.length); 17 System.arraycopy(rhs, 0, dst, this.chars.length, rhs.length); 18 return new MStringObj(dst); 19 }

Java言語で配列を結合する方法(一つにまとめる)を見やすくまとめてみた


余談、悪意を持った人がリスコフの置き換え原則を使ってMStringObjクラスのサブクラスを宣言し悪用するのを防ぐためにStringクラスと同様にMStringObjfinalで宣言してくださいな。

Java

1public final class MStringObj implements MString

投稿2018/07/22 10:32

編集2018/07/22 11:57
umyu

総合スコア5846

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

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

退会済みユーザー

退会済みユーザー

2018/07/22 11:33 編集

詳しい解説、本当にありがとうございます。おかげ様でかなりすっきりしました。最後に一つだけ、以下のエラーが出てしまうのですが、原因は何でしょうか。 MStringObj.java:45: エラー: シンボルを見つけられません char[] rhs = s.toCharArray();        ^ シンボル: メソッド toCharArray() 場所: タイプMStringの変数 s
umyu

2018/07/22 11:37

appendするということは該当のインスタンスの文字列を返す必要があります。 interfaceのMString にtoCharArrayを宣言してくださいな。
退会済みユーザー

退会済みユーザー

2018/07/22 11:38

すいません! MString.java の方に public char[] toCharArray() を追加するのを忘れていました。解決しました。
guest

0

String str = chars[i] + s;

じゃないでしょうか

投稿2018/07/22 08:41

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2018/07/22 10:26 編集

ご回答ありがとうございます。以下のように変更してみたのですが、 public MString append(MString s) { for (int i = 0; i < chars.length; i++) { MString mstr = chars[i] + s; return new MStringObj(mstr); } } 以下のエラーが発生してしまいます。 MStringObj.java:42: エラー: 二項演算子'+'のオペランド型が不正です MString mstr = chars[i] + s; ^ 最初の型: char 2番目の型: MString MStringObj.java:43: エラー: 不適合な型: MStringをchar[]に変換できません: return new MStringObj(mstr); ^ 原因は何でしょうか、、? P.S. コメント完了すると、なぜかインデントの階層がずれてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問