🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

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

Q&A

解決済

1回答

1640閲覧

scalaで多次元配列を作る方法

st-access_91s

総合スコア43

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

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

0グッド

0クリップ

投稿2019/12/14 11:13

編集2019/12/14 11:16

Javaの多次元配列にちなんで、scalaで多次元配列を書いてみました。

scala

1object MultiArray { 2 def main(Args:Array[String]) { 3 var multi = Array((2,4,8),(3,6),(12)) 4 for(a <- 0 to multi.length) { 5 for(b <- 0 to multi(a).length) { 6 println("multi(" + a + ")(" + b + ") = " + multi(a)(b)) 7 } 8 } 9}

すると、5行目のmulti(a).lengthのところで「value length is not a member of Any」、
6行目のmulti(a)(b)のところで「Any does not take parameters」というエラーが出てしまいます。
手持ちの教材『ボクらのScala』や、インターネットで調べても、解決方法に辿り着くことができなかったため、こちらに質問致しました。
どなたかエラーの原因と解決方法がお分かりになる方おりましたら、ご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Scala

1var multi = Array((2,4,8),(3,6),(12))

このコードでは多次元配列にはなりません。
multiの各要素(2,4,8),(3,6),(12)は、それぞれタプルという型とInt型になります。
そこでmultiの型はそれらの型の共通のスーパークラスであるAny型を要素に持つ配列(Array[Any])だと推論されます。(ScalaではAnyはすべての型のスーパークラスです)
その結果、multi(a)はAny型のオブジェクトということになり、lengthやapplyを呼び出したときにエラーになるということです。
解決法はきちんと要素が配列になるようにArrayで囲うことです。

Scala

1 var multi = Array(Array(2,4,8), Array(3,6), Array(12))

投稿2019/12/14 12:11

編集2019/12/14 12:28
yudedako67

総合スコア2047

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

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

xebme

2019/12/14 12:17

(12) はタプルではなくIntですね。要素数1のタプルはありません。
yudedako67

2019/12/14 12:25

本当ですね。修正します。
st-access_91s

2019/12/15 04:47 編集

ご回答いただきありがとうございます。 いただいた回答に基づき修正すると、「value length is not a member of Any」と「Any does not take parameters」のエラーはなくなりましたが、オブジェクトを実行すると、 multi(0)(0) = 2 multi(0)(1) = 4 multi(0)(2) = 8 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 となり、 multi(1)(0) = 3 multi(1)(1) = 6 multi(2)(0) = 12 の後続の値が出力されません。ArrayIndexOutOfBoundsException: 3 なので、multi(3)(0)を探しに行っているのだと思いますが、こちらについてはどのようにすればよろしいでしょうか。
yudedako67

2019/12/14 13:11

それは別の問題ですが、toをuntilに変えれば出なくなります。
st-access_91s

2019/12/14 14:02

解決致しました。 ご回答いただきありがとうございます。
st-access_91s

2019/12/15 05:15

申し訳ありません、本日、復習を兼ねて読み返していたところ、yudedako67さんの回答にあります「その結果、multi(a)はAny型のオブジェクトということになり、lengthやapplyを呼び出したときにエラーになるということです。」の部分で気になる点が発生しました。 ArrayやListが、メソッドとしてlengthやapplyを持っているのは知っているのですが、それなら全てのスーパークラスであるAny型でも呼び出せるのではないでしょうか。自分でも調べたのですが、解決できませんでした…。 よろしければ、こちらについてもご教授願えますか?
xebme

2019/12/22 03:16

>(12) はタプルではなくIntですね。要素数1のタプルはありません。 「要素数1のタプルはありません」は間違いです。実際にはTuple1というクラスが定義さています。 (12)はInt型に解釈されますが、Tuple1(12)と明に指定するとタプル型です。 https://www.scala-lang.org/api/2.13.1/scala/Any.html?search=Tuple 質問の場合は、型がTuple3, Tuple2, Intになります。 Tuple.. と Intの共通のスパークラスは、Anyにしかならないようです。
st-access_91s

2019/12/22 11:00

>ryshさん 返信遅くなって申し訳ありません。 いただいたリンク先を確認したのですが、これはつまり…Anyクラスから直接呼び出せるのはConcrete Value Membersに定義されているメンバのみということでしょうか? >xebmeさん 追加の解説ありがとうございます。 そういえばTupleは1~22までありましたね…。
xebme

2019/12/22 15:11

>Anyクラスから直接呼び出せるのはConcrete Value Membersに定義されているメンバのみということでしょうか? Anyは抽象クラスなのでインスタンス化できません。しかし実行時にAny型にされていても背後には具象型が存在します。abstract、concrete どちらも呼べます。 val a:Any = 3 a.getClass
st-access_91s

2019/12/30 17:48

>xebmeさん 返信遅くなって申し訳ありません。 抽象クラスがインスタンス化出来ないのは認識しているのですが、 ①「背後には具象型が存在します。」というのは、例えば今回の質問例で言うと、  具象型=Tuple型・Int型  ということでよろしいでしょうか。 ②val a:Any = 3  a.getClass  という記述は、直前の解説の事例だと思いますが、この事例と解説内容の結び付きについて詳しく教えていただけますか。 申し訳ありません、当方、初心者レベルなもので、断片的にしか理解出来てなくて(しかも質問に初心者マーク付け忘れました…)。
xebme

2019/12/30 21:13

説明が悪くて申し訳ありません。 >Anyクラスから直接呼び出せるのはConcrete Value Membersに定義されているメンバのみということでしょうか? これはオブジェクト指向の話です(質問の本筋からはずれていますが)。抽象クラスの抽象メンバーは具象クラスの具象メンバーでオーバーライドされることが明らか(実装の強制)なので、Concrete Value MembersのみならずAbstract Value Memberも使えなければなりません。 ①はコンパイル時の型のことですね。これは答え忘れています。上の原則からAnyのAbstract Value Memberも使えなければなりません。 ②は実行時の「ポリモーフィズム」の具体例です。IntからAnyへのアップキャストが行われます。getClass はAbstract Value Memberですが呼べます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問