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

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

ただいまの
回答率

90.32%

  • Java

    14433questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 421

nvcpg_198

score 14

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

たとえばint型の配列を、全要素数9で定義するとき、
要素番号を0~8ではなく1~9で扱えるようにする方法は
ありませんか?要素数を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 ) ]

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2017/09/12 13:34

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

    キャンセル

回答 5

+2

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

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

flags.put(8, false);
System.out.println(flags);
//=> {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 14:11

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

    キャンセル

  • 2017/09/12 14:13

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

    キャンセル

+2

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 14:12

    投稿中に解決していましたOTL

    キャンセル

  • 2017/09/12 14:14

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

    キャンセル

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 13:47

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 13:51

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

    ですが回答してくれてありがとうございます。

    キャンセル

0

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

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

#define vArray(i) realArray[i-1]

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 13:57

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

    キャンセル

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

  • Java

    14433questions

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