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

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

ただいまの
回答率

90.35%

  • Java

    14367questions

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

Listから値を取得するときに順番がばらばらになる。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 365

flumchaso

score 3

 前提・実現したいこと

DBからデータを取得したときに設定した順番で値を取得したい。

 該当のソースコード

SELECT areaCd, areaNm, areaENm
FROM areaMaster
ORDER BY areaCd


と、このSQLで日本の各地方をList化して取得します。
DBには以下の通りに入っています。設定時はareaCdの小さい順に入っています。デバッグで確認済み。

areaCd areaNm areaENm
01 北海道 hokkaido
02 東北 tohoku
・・・
08 九州 kyushu

TestMasterInterceptor.java

LinkedList<areaMaster> areaMasterList = getAreaMaster();
areaMasterListは実際使用時にアノテーションAutowiredを使用し呼び出しています。

TestInterceptor.java

@Autowired TestMasterInterceptor master;
・・・
for (areaMaster am : master.getAreaMasterList()) { //ここで取得したときに設定したときの順番と違う。
    //処理実施
}

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

java8,spring

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/06/29 10:30

    実行結果、どのようになっているのでしょうか。 データ取得処理部分と出力結果もご提示ください。あとできればそれぞれの型も含めたテーブル定義も。

    キャンセル

  • mather

    2018/06/29 11:12

    DBからデータを取得してリストに変換する部分が気になります。質問には ORDER BY の付いたクエリを表示していますが、実際そのとおりにクエリが発行されているんですか?DBに格納されている順番というのは保証できない(追記型など)のでクエリをきちんと確認すべきです。

    キャンセル

  • Wind

    2018/06/29 12:25

    「設定時はareaCdの小さい順に入っています。デバッグで確認済み。」この確認した画面をキャプチャして貰えないでしょうか?

    キャンセル

回答 3

+2

コードを見る限りでは、特に問題なさそうですので、あとは推測になります。

DBへのアクセスは何を使用しているのでしょうか? JDBCそのまま?なんらかのO/R Mapper?
O/R Mapperを使用しているならば、そこで何かが起きている可能性があります。
そのO/R Mapperのドキュメントを確認してみると良いと思います。

また、もう一点気になったこととして、areaCdが最大二桁の数字の0詰め文字列として扱われているので、100件を超えたときに文字列によるソートになってしまい

 areaCd   areaNm   areaENm 
100 沖ノ鳥島 okinotorishima
11 東京都 toukyoto

のようなことになっていたりしないでしょうか?この場合なら、areaCdをintにする、または、0詰めを十分な桁数にすることで解決すると思います。

余談ですが、テーブル名(とクラス名)がlowerCamelになっているのが気になります。社内の規約なら仕方ないと思いますが治せるならぜひクラス名だけでもUpperCamelにっ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

-1

すみません。
他の方が作成したソースで順番を変えたところがあり、Autowiredしているのですが
そのまま参照して値を変えていたため元のListの順番が変わってしまっていたようです。

順番を入れ替えたところで新しいListに詰め直すようにして元のListには影響がないように対応しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

私は趣味でC++やっています。
なので妄想入りですが。


たぶん仕様です。最初、「適当にセットしたからじゃね?」と思ったのですが、

DBには以下の通りに入っています。設定時はareaCdの小さい順に入っています。デバッグで確認済み。

とあることから、除外。

ほかの可能性を考えて見ました。

でも思いつかなかったのでコードを見ると...

リスト構造は LinkedList で生成していますね。これが原因なのでは?と思いました。
で、気になったので「LinkedList ArrayList 違い」及び「LinkedList 順番が狂う」と検索すると、

根拠1: LinkedList

がヒットしました。

ArrayListは「次のオブジェクトへのポインタ」を持っているような状態なのに対し、LinkedListは「前と後ろのオブジェクトへのポインタ」を持っている状態です。 ( C言語風にいうと。 )

で、

> LinkedListは自分で順序を持ってないためインデックスを指定してダイレクトにオブジェクトを読み出す場合は、インデックスが全体の前半にある場合は先頭から、後半にある場合は後から順番を数えて読み出します。 ( from 根拠1のページ )
とあります。 

ということは、C++のiteratorに相当するもの ( Javaにも iterator自体はあるようですが使ったことない... ) (根拠2: [Java] Iteratorのメモ) が後ろにある状態でそれを元に戻していないから後ろから読み込まれているため、ソート済みでない感じになっていると思います。
どうしてもLinkedListを使いたいなら、iteratorに相当するやつで先頭に持ってきて...とするか、 ArrayListの方を使うか...だと思います。 ( iteratorを使わなくても先頭にiteratorに相当するやつを前に持ってくることができればそれでいいし。 )

[追記1]
どうやら、takezoux2さんのご指摘によると

ArrayListはリスト構造ではなく、内部に配列を持った実装です。
また、LinkedListも追加された要素の順番が変化することはありません。
なので、違うみたいです。取り消し線で取り下げますね。

たぶん、私が最初に挙げた内容が違うなら、「そもそもの前提であるデータ設定がなんらかの理由(ライブラリがバグを含んでいる等)によっての操作ミス」か「(〃)によってのソートミス」が考えられますね。
それかDBから引っ張ってくるときのデータとかが壊れているか、使い方が間違っているか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/29 12:46

    ArrayListはリスト構造ではなく、内部に配列を持った実装です。
    また、LinkedListも追加された要素の順番が変化することはありません。説明に書かれていることは、get(int index)によるindexアクセスの際の最適化の話なので、iteratorには関係しません。
    なので、基本的にLinkedListをArrayListに変更しても治る可能性は低いかと思います。(使っているDB周りのライブラリがバグや仕様でLinkedListの時に特殊処理をしている場合は治るかもしれませんが)

    キャンセル

  • 2018/06/29 13:32 編集

    takezoux2さん、ありがとうございます。
    マジですか!?
    だったらArrayListって名前不適切だと思いますね。Vectorみたいにすべきだと思います。
    ( まぁ、Javaの開発者辺りの趣味だと思いますし、ここで言ってもどーしよーもないですが。 )
    じゃあ、設定する前の問題かな?

    キャンセル

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

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

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

  • Java

    14367questions

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