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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

5回答

535閲覧

戻り値が2つ以上のメソッドの実装

mishina

総合スコア0

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/18 05:56

前提・実現したいこと

①入力された式を配列に格納し、カッコ「(」とカッコ閉じ「)」の探索を行う
②それぞれの要素番号を戻り値として返す

戻り値が2つ以上のメソッドについてもっとスマートな書き方があれば教えて頂きたいです。

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

非 static フィールド startid を static 参照できません 非 static フィールド endid を static 参照できません

該当のソースコード

java

1public class Sub{ 2 int startid; 3 int endid; 4 5 public static int CheckKakko(String[] array){ 6 Sub id = new Sub(); 7 for(startid = 0; startid < array.length ; startid++){ 8 if(array[startid].equals("(")){ 9 id.startid = startid; 10 break; 11 } 12 } 13 for(endid = array.length-1 ; endid < 0 ; endid--){ 14 if(array[endid].equals(")")){ 15 id.endid = endid; 16 break; 17 } 18 } 19 return id; 20 } 21}

試したこと

idを戻り値として返すためのクラスを作成する

補足情報(FW/ツールのバージョンなど)

Java SE7

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

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

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

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

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

guest

回答5

0

調べるクラスと保持するクラスを分けずに、それ自体をクラスにしてしまっていいと思う

JAVA

1public class CheckKakko{ 2 public int startid; 3 public int endid; 4 5 // コンストラクタで文字列を受け取る 6 public CheckKakko(String[] array){ 7 // 値を設定(ロジックはそのままです) 8 for(int i = 0; i < array.length ; i++){ 9 if(array[i].equals("(")){ 10 startid = i; 11 break; 12 } 13 } 14 for(int i = array.length-1 ; i < 0 ; i--){ 15 if(array[i].equals(")")){ 16 endid = i; 17 break; 18 } 19 } 20 } 21}

使い方

JAVA

1CheckKakko k = new CheckKakko("調べたい文字列"); 2System.out.println("Start:"+k.startid); 3System.out.println("End :"+k.endid);

ただ、この方法だと、保持した値は好きに書き換えられちゃうので、きちんと作るなら、
フィールドはprivateにして、getStartid(),getEndid()みたいなアクセサメソッド経由に
すべきだとは思う。


もし純粋に元のままでエラーだけ回避したい場合は

JAVA

1public class Sub{ 2 int startid; 3 int endid; 4 5 public static int CheckKakko(String[] array){ 6 Sub id = new Sub(); 7 for(int startid = 0; startid < array.length ; startid++){ 8 if(array[startid].equals("(")){ 9 id.startid = startid; 10 break; 11 } 12 } 13 for(int endid = array.length-1 ; endid < 0 ; endid--){ 14 if(array[endid].equals(")")){ 15 id.endid = endid; 16 break; 17 } 18 } 19 return id; 20 } 21} 22

forの中で使ってるstartidendidに、intを付けて、ローカル変数にする。
とりあえず、こうすれば、クラスメソッドからインスタンス変数へのアクセスはなくなる。

投稿2020/08/18 06:31

編集2020/08/19 01:11
amiya

総合スコア1216

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

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

0

List<int[]> を返すようにして見ました。
次のコードと、その実行例を研究してみてください。

java

1import java.util.ArrayList; 2import java.util.List; 3 4class Sub { 5 public static List<int[]> CheckKakko(String[] array) { 6 List<int[]> ret = new ArrayList<int[]>(); 7 List<Integer> stack = new ArrayList<Integer>(); 8 9 final int len = array.length; 10 for (int pos = 0; pos < len; pos++) { 11 String s = array[pos]; 12 if ("(".equals(s)) { 13 stack.add(pos); 14 } else if (")".equals(s)) { 15 int list_size = stack.size(); 16 int[] pair = { -1, pos }; 17 if (stack.size() > 0) { 18 int pos_0 = stack.get(list_size - 1); 19 stack.remove(list_size - 1); 20 pair[0] = pos_0; 21 } 22 ret.add(pair); 23 } 24 } 25 for (int pos_0 : stack) { 26 int[] pair = { pos_0, -1 }; 27 ret.add(pair); 28 } 29 return ret; 30 } 31} 32 33public class Main { 34 public static void main(String args[]) { 35 String[] TESTS = { 36 "1 + 2", 37 "1 * ( 2 * 3 )", 38 "( 1 + 2 )", 39 "( ( 1 + 2 ) )", 40 "( 1 + 2 ) * ( 3 + 4 )", 41 "( 1 ", 42 "1 )" 43 }; 44 45 for (String str : TESTS) { 46 List<int[]> ret = Sub.CheckKakko(str.split(" ")); 47 System.out.println("'" + str + "'"); 48 for (int[] kakko : ret) { 49 System.out.print("[" + kakko[0] + ", " + kakko[1] + "], "); 50 } 51 System.out.println(); 52 } 53 } 54}

実行例

イメージ説明

対になる (, ) の場所を返しています。対になるものが無かった場合は、 -1 でそのことを示します。

投稿2020/08/18 22:57

katoy

総合スコア22324

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

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

0

私は、複数の値を返したかったらオブジェクトを定義するサインだと考えています。

java

1public class Sub{ // クラス名は適切に命名すること 2 String[] array 3 4 public Sub(String[] array){ 5 this.array = array; 6 } 7 8 public int getStartId() { 9 for(int startid = 0; startid < array.length ; startid++){ 10 if(array[startid].equals("(")){ 11 return startid; 12 } 13 } 14 throw new Error("'(' is not found."); 15 } 16 17 public int getEndId() { 18 for(int endid = array.length-1 ; endid < 0 ; endid--){ 19 if(array[endid].equals(")")){ 20 return endid; 21 } 22 } 23 throw new Error("')' is not found."); 24 } 25} 26

メソッドが小さくなって、スッキリしたと感じて貰えれはありがたい。

投稿2020/08/18 13:30

iwamoto_takaaki

総合スコア2883

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

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

iwamoto_takaaki

2020/08/18 14:33

内容他の回答者とかぶってた。。。
guest

0

public static Sub CheckKakko(String[] array){

でどうでしょう.

投稿2020/08/18 06:00

編集2020/08/18 06:01
y_waiwai

総合スコア87719

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

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

0

戻り値が2つ以上のメソッドについてもっとスマートな書き方があれば教えて頂きたいです。

int[]を返す、という方法も考えられます。

投稿2020/08/18 05:59

maisumakun

総合スコア145121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問