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

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

ただいまの
回答率

87.48%

どうやったらintとcharが両方入った2D Arrayを作れますか?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,018

score 22

前提・実現したいこと

学校の課題で、チャートを作成してそこから九九の表のように表を縦軸と横軸で見て該当する数字を表示させないといけないのですが、intとchar両方が入った多次元配列を作れず困っています。

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

この表をインプットしなければならなく、イメージ説明

サンプルのアウトプットがこれです。
(ユーザーが2つのStringを入力し、それを計算します)
イメージ説明

私が書いているコードはこちらなのですが、初心者なので右も左もわからずここから苦戦しています。検索しても教科書を読んでも理解できません。。。
イメージ説明
イメージ説明

該当のソースコード

import java.util.Scanner;
public class ProteinScore {
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);

        char[][] protein = {
                {' ','A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V','*'},
                {'A','4','-1','-2','-2','0','-1','-1','0',''-2','-1','-1','-1','-1','-2','-1','1','0','-3','-2','0','-4'},
                {'R','-1','5','0','-2','-3','1','0','-2','0','-3','-2','2','-1','-3','-2','-1','-1','-3','-2','-3','-4'},
                {'N',-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,-4},
                {'D',-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,-4},
                {'C',0,-3,-3,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,-4},
                {'Q',-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,-4},
                {'E',-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,-4},
                {'G',0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-4},
                {'H',-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,-4},
                {'I',-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-4},
                {'L',-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4},
                {'K',-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,-4},
                {'M',-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-4},
                {'F',-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-4},
                {'P',-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-4},
                {'S',1,-1,1,0,-1,0,0,0,-1,-2,-2,-0,-1,-2,-1,4,1,-3,-2,-2,-4},
                {'T',0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-4},
                {'W',-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4},
                {'Y',-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-4},
                {'V',0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-4},
                {'*',-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1},
                };

        System.out.println("This program will score protein sequences.");

        System.out.println("Please enter protein sequence.");
        String p1 = sc.nextLine();

        System.out.println("Please enter an additional protein sequence.");
        String p2 = sc.nextLine();

        for(int i=0;i<p1.length();i++){
            for(int j=0;j<protein.length;j++){
                if(p1.charAt(i)==protein[j])
        }

        }

    }
}

java

試したこと

教科書を隅々まで読みました。
それと日本語と英語でやり方を検索しましたが参考になる答えは得られませんでした。

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

Java

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Momomo.

    2017/11/07 11:43

    2つのStringを同じ長さにするためで、もし2つめが1つめより1文字短い場合は2つ目のStringの最初に*をつけます。その後もう1文字短い場合は語尾に*をつけます。それでもまだ1つめより短い場合は語尾にさらに*を足すという形です。

    キャンセル

  • fuzzball

    2017/11/07 11:47 編集

    最初だけ前で、その後は全て語尾ということでしょうか?一つ目の方が短い場合も同様に * を付けるのでしょうか?

    キャンセル

  • Momomo.

    2017/11/07 11:50

    はい!その通りです。

    キャンセル

回答 5

+2

他の方々の回答の通りなのですが、String型を既に習っているのなら、charの配列を使い検索する代わりに

String code="ARNDCQEGHILKMFPSTWYV*";
int idx=code.indexOf("入力された文字");


で、アクセスすべき数値のインデックスを得る方法もあります。
実現するためのコードの実装方法は色々ありますが、仰るような制約事項が先に判っていないと、抽象的になってしまい、思った通りの回答は得にくいかも知れません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 12:35

    ありがとうございます!
    この方法全く思いつきませんでした。。。
    試してみます!

    キャンセル

checkベストアンサー

+1

まず、すでに出ている通り上の行と左の列はただのインデックスなので、配列に入れる必要はありません。
入力された文字から行番号・列番号への対応がわかれば、二次元配列から答えを出すことができるわけです。

行も列も、A,R,N,D,C,Q,E,G,H,I,L,K,M,F,P,S,T,W,Y,V,*の順に並んでいるため、Aなら0、Rなら1という具合に対応すればいいわけです。
配列を作ってその中から探すという方法もありますが、ここでStringのindexOfが使えそうではありませんか…?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 12:37

    わかりやすい回答ありがとうございます!
    この方法試してみます。

    キャンセル

+1

そもそも、テーブルの外側の文字は見出しなので、テーブルのデータとして入れること自体が不適当なのではないかと思います。

右側、上側とも順番は同じようですので、中身のテーブルをint[][]で、文字とテーブルのインデックスの関係を別個で管理する、というような形が適当ではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 10:13

    賛成です。
    私も習ってなくても学んだことはどんどん使いたいんですが、学部のポリシーで習っていないコードを使った場合は大幅に減点されることになっていて。。。
    そのためGoogleなどで検索しても習った範囲でのやり方を見つけられず苦戦している状態です。

    キャンセル

  • 2017/11/07 10:17

    char[]の配列に入れて、ループして一致するか探す、という手段しかないですね。

    「検索しても見つからない」のは、「実用上そんなことをするメリットがない」からで間違いないです(Javaの場合、「環境が整わなくて自力で実装しないといけない」ということはそうないですし)。

    キャンセル

  • 2017/11/07 12:38

    回答ありがとうございました。
    とても参考になりました。

    キャンセル

+1

教科書を読んで理解できないときは、先生に聞くのが普通のやり方です。

2次元配列に入れるのは数値だけでよさそうに見えますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 10:04

    書いておくべきでしたね。誤解させてしまって申し訳ないです(>_<)
    もうこれ以上方法がないところまで自分で試して、それでも無理だったので質問させていただきました。
    回答してくださり感謝します。

    アルファベットだけの配列を1つ作って、そこからindexで表の数字を探せばいいということでしょうか?

    キャンセル

  • 2017/11/07 11:19

    そうですね。例えば、"R"だと文字列配列の2番目に見つかるので、2次元配列の2番目を見ればいい

    キャンセル

  • 2017/11/07 12:37

    わかりやすく教えてくださりありがとうございました。
    試してみます!

    キャンセル

+1

質門としては、「charとintの混在した配列の作り方」だと思いますが、
Object型の配列にすれば、作成できます。

Object[][] protein = {
    { ' ', 'A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', '*' },
    { 'A', 4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -4 },
    { 'R', -1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -4 },
    { 'N', -2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, -4 },
    { 'D', -2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, -4 },
    { 'C', 0, -3, -3, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, -4 },
    { 'Q', -1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, -4 },
    { 'E', -1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, -4 },
    { 'G', 0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -4 },
    { 'H', -2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, -4 },
    { 'I', -1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -4 },
    { 'L', -1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4 },
    { 'K', -1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, -4 },
    { 'M', -1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -4 },
    { 'F', -2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -4 },
    { 'P', -1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -4 },
    { 'S', 1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, -0, -1, -2, -1, 4, 1, -3, -2, -2, -4 },
    { 'T', 0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -4 },
    { 'W', -3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4 },
    { 'Y', -2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -4 },
    { 'V', 0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -4 },
    { '*', -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1 },
};

ですが、他の方も言っている通り、見出しの配列と、内容の配列は分けた方がいいでしょうね。
まず、見出しの配列から検索をかけると、場所が分かります。
内容の配列から、その場所にアクセスすれば取得できるだろうという考えですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 12:36

    ありがとうございます。
    ずっと両方を配列に同居させないといけないと思っていたので目から鱗です。

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る