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

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

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

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

Q&A

解決済

5回答

126閲覧

Javaでの配列の定義の仕方について

nvcpg_198

総合スコア25

Java

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

0グッド

2クリップ

投稿2017/09/12 04:31

編集2017/09/12 04:47

###Javaでの配列の定義の仕方について
たとえばint型の配列を、全要素数9で定義するとき、
要素番号を08ではなく19で扱えるようにする方法は
ありませんか?要素数を10で定義して0番目をシカトしろとか
一休さんみたいな話じゃなくて。

数独解析のプログラムを書こうとしているのですが、
あるマスに数字を埋めることが可能かを判断するための
フラグ配列を定義する必要があります。数独は1~9の
いずれかの数字を埋めるパズルですが、例えばあるマスには
8の数字を埋めることができない場合、8に該当するフラグを
ONにするというやり方にしようと考えています。

9つの数字についてフラグを用意する場合、
9つの要素数を持つ配列を用意するという発想になったんですが、
その場合0~8の要素番号で扱える配列になります。
この場合、8に該当するフラグならば要素番号が7のように、
数字をnとすると配列の要素番号は(n - 1)になります。

じゃあそう書けよって言われそうですが、
他人が見た時、ソースを編集するときに
数字がnのときは要素番号もnといった対応のほうが
わかりやすいと思うんです。

これを実現しようとすると配列を10で定義して
要素番号を0~9として扱えますが、最初の要素番号0の
メモリ領域が無駄になります。別に無駄になっても
影響はないと言えばないです。ただ、無駄にしなくても
いい方法があるなら知ってみたいなと思ったので。

C言語であればマクロで解決できる問題です。
例 : #define STATUS_NUMBER( ROW, COL, NUM ) array[ ( ROW - 1 ) ][ ( COL - 1 ) ][ ( NUM - 1 ) ]

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

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

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

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

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

m.ts10806

2017/09/12 04:34

なぜそうしたいか(そうする必要があるか)も追記願います。
guest

回答5

0

これを実現しようとすると配列を10で定義して
要素番号を0~9として扱えますが、最初の要素番号0の
メモリ領域が無駄になります。

仰るとおり、0番目をダミーデータにすれば一要素分のムダが生じます。が、一方、アクセス時にインデックスをずらす処理を追加するならばその文の時間がムダになります。(Cのマクロ、プリプロセッサのように、コンパイル時の変換機能があるならば別として)結局はメモリのムダと時間のムダのトレードオフになります。

多分、これを(ノーオーバーヘットで)実現する方法を調べるならば、javaの言語仕様ではなく開発環境の機能を調べるといいと思います。まあ、ないかもしれませんけど。

投稿2017/09/12 05:11

HogeAnimalLover

総合スコア4830

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

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

nvcpg_198

2017/09/12 05:14

いやすいません、もう無理っぽいと判断して 早とちりしました。ですが、良い回答をありがとうございます!
guest

0

連想配列を使う。
Javaはあまり詳しくないので書き方とか変だったらすみません。

java

1HashMap<Integer, Boolean> flags = new HashMap<Integer, Boolean>(); 2for (int i = 1; i <= 9; i+=1) { 3 flags.put(i, true); 4} 5System.out.println(flags); 6//=> {1=true, 2=true, 3=true, 4=true, 5=true, 6=true, 7=true, 8=true, 9=true} 7 8flags.put(8, false); 9System.out.println(flags); 10//=> {1=true, 2=true, 3=true, 4=true, 5=true, 6=true, 7=true, 8=false, 9=true}

容量を無駄にしたくないと言うなら、int配列なんか使わずにビット演算にしましょう。
1〜9のフラグなら9bit(実質16bit?)で済みます。

投稿2017/09/12 05:08

fuzzball

総合スコア16731

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

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

nvcpg_198

2017/09/12 05:11

なるほど、ビット演算のほうがいいですね。 ありがとうございます!
nvcpg_198

2017/09/12 05:13

連想配列なるものがありましたか・・・ 勉強になります。ありがとうございます。
guest

0

javaの配列のインデックスが0から始まるというのは、java言語の仕様なので変更できません。

下例のように配列ごとに関数形式マクロを書くのは可能ですが、配列のインデックスなら[]で囲まれるのに、関数形式マクロだと()で囲まれることになるので、「要素番号を09ではなく110で」を完全に満たしているとは言い難いです。

#define vArray(i) realArray[i-1] int realArray[10]; // realArray[3]と、vArray(4)は、どちらもrealArrayの4番目の要素を意味する。

投稿2017/09/12 04:48

coco_bauer

総合スコア6915

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

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

nvcpg_198

2017/09/12 04:57

確かに質問の仕方が悪かったですね。 内部的な処理はどうあれ、容量を無駄にせず 1~9の数字についての処理を扱う、といった内容に該当します。 ですがJavaはマクロを使えるという仕様ではないですよね?
guest

0

自分で「数独用のデータ」クラスを立てて、やり取りするメソッドで1ずらして読み替える、というような方法が考えられます。

投稿2017/09/12 04:48

maisumakun

総合スコア145121

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

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

nvcpg_198

2017/09/12 04:51

もちろんそういう方法は考えつきますが、 配列を更新するたびに1をずらすためのメソッドを 呼び出すというのが処理スピードのネックになるのではと 思ったのでこういった質問をしました。 ですが回答してくれてありがとうございます。
guest

0

ベストアンサー

Javaの配列のルールとして「要素番号は0から始まる」となっておりますので、無理だと思います。

http://www.task-notes.com/entry/20140923/1411477102

投稿2017/09/12 04:46

nak

総合スコア696

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

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

nvcpg_198

2017/09/12 04:47

やはり無理っぽいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問