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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

7135閲覧

AndroidでArrayAdapter(ArrayList)をソートしたい

worldrun

総合スコア19

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2016/03/04 11:45

配列をソートしたいという質問です。

調べた所ArrayListはこんな感じでソートできます。
ArrayAdapterは.sort()を使えばソートできます。

しかし、ググって見ても配列の中にあるデータが、Stringのみだったりintegerのみだったりします。

今ソートしたいのは、Itemという独自クラスです。
このクラスはprivateで様々なデータを抱えています。このうちのdoubleのデータの大小を比較して、ソートしたいのです。
つまり、Item.hogeを比較してソートしたいということです。何か良い知恵はありませんでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

手元に環境がないのでリファレンスからの確認ですが、[ArrayAdapter.sort](http://developer.android.com/reference/android/widget/ArrayAdapter.html#sort(java.util.Comparator<? super T>))でできませんか?

ArrayAdapter.sort(new Comparator<Item>() { @Override public int compare(Item i1, Item i2) { return Double.compare(i1.getHoge(), i2.getHoge()); } });

投稿2016/03/05 09:28

liply

総合スコア150

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

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

worldrun

2016/03/05 09:44

ありがとうございます。Adapterがsortもってたんですね、チェックしてませんでした。 早速試しているんですが、1つ疑問があります。 別のところでも詰まったんですが、ArrayAdapterの中にあるデータに手を加える場合どうするのがベストでしょうか? 今は 1.別のArrayAdapterであるArrayAdapter2(AA2)を作る 2.AA2に元のArrayAdapter(AA)の内容を、手を加えながらコピーする(AA2=AA) 3.ここでAA=AA2とすると他のAAを参照している部分に支障が出るので、AAをclearしてから、AA2の中身をAAにfor文でうつす という非常に手間なことをやっています。
liply

2016/03/05 10:05

質問内容が違う場合は、後々同じ問題でつまった人のために分けてください。
worldrun

2016/03/05 11:03

分かりました。ソート手段は出そろったので分けます。
guest

0

stack overflow(英語のプログラミング掲示板)に同じような質問が乗っていました。
そこでのベストアンサーを簡単に訳して記載します。

その前に、ArrayAdapterとArrayListについて
ArrayAdapterはArrayListのデータをListViewなどのViewにAdapt(適合)するためのクラスで、
コンストラクタメソッドの引数にArrayListを受け取ります。

ArrayAdapterは受け取ったデータを受け取った順にViewに配置します。
なので、質問者様が望む結果にするにはArrayListでソートされた状態になっていれば良いですよね?

ということで、下記はArrayListをdoubleをソートキーにしてソートする方法です。


以下、引用の訳
「arrayListのdouble値でのソート方法について」

質問者の掲載したソースの一部
(染色体クラスを定義し、そのデータにスコアをつけて、スコア順でソートしたいらしいです。)

lang

1public class Chromosome { 2 double score; 3 4 public void setScore(double score) { this.score = score; } 5 public double getScore() { return score; } 6}

arashajiiさんの回答:
Comparatorを使用してください:

lang

1Collections.sort(myList, new Comparator<Chromosome>() { 2 @Override 3 public int compare(Chromosome c1, Chromosome c2) { 4 return Double.compare(c1.getScore(), c2.getScore()); 5 } 6});

もしこの方法で数値によるリストのソートを考えているなら、
Comparableを継承してChromesomeを用いることを提案します。
(単に Collections.sort(myList)を呼び出す場合、Comparatorを明示的に特定する必要はありません)

stackoverflow:Sorting a double value of an object within an arrayList より


以上、
参考になりますでしょうか?
分からない場合、別途ご連絡ください。

P.S.
Collectionsクラスのリファレンスへのリンクは下記です。
Collectionsクラス

投稿2016/03/04 13:56

Aeona

総合スコア396

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

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

worldrun

2016/03/04 14:03

ありがとうございます。c1.getScore()のような使い方ができるんですね、知りませんでした。 stackoverflowはarraylist sortなどで軽く検索したくらいで、object等の単語を試していませんでした。 今日は実機で試せないので、明日試してご報告します。
worldrun

2016/03/05 09:00

おかげさまでソートは出来たようなのですが、ArrayAdapter(this)にArrayListをセットする方法がイマイチ分かっていません。というか、ArrayAdapterにArrayListをセットするという考え方自体何か違う気がしてきました。 今流れとしては 1.MainActivityで現在地を取得してonConnectedで自作ArrayAdapterクラスの関数に渡す 2.LocationをもらったらArrayAdapter(this)を元にdistanceを出して、Itemクラスの.distance(double)にセットする。セットしたItemをArrayListにいれる 3.ArrayListをソートする(c1.getDistanceで解決) 4.ArrayListをArrayAdapterにセット(更新?)して、this.notifyDataSetChanged();でListViewを更新する ←これがやりたい こういう状況です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問