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

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

詳細はこちら
Java

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

Android

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

1469閲覧

SQLiteに登録された情報をArrayAdapter(ArrayList)を用いて昇順にソートして表示

karin10

総合スコア34

Java

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

Android

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2020/12/08 09:52

編集2020/12/09 03:31

データベース(Product)に保存した内容(食品名、量)をArrayAdapterを用いて表示させているのですが、
表示される順番が登録順になっているので、
これを昇順(食品名、量の二つとも)に表示させようとしています。

公式サイトよりArrayAdapter.sortを用いて試しているのですが、

return int.compare(i1.getfoodName(), i2.getfoodName());  // .に赤線が出ます

という状況です。
ご教授お願い致します。

public class FoodActivity extends AppCompatActivity { private ArrayList<Product> products; public void onResume(){ super.onResume(); //データベースを読み込む      products = new ArrayList<Product>(); SQLiteDatabase db = helper.getReadableDatabase(); String[] columns = {"id", "foodName", "foodgram"}; Cursor cursor = db.query("Products", columns, null, null, null, null, null); while(cursor.moveToNext()) { int id = cursor.getInt(0) ; String foodName = cursor.getString(1); double foodgram = cursor.getDouble(2); products.add( new Product(id, foodName, foodgram) ); } String[] items = new String[products.size()]; for(int i = 0; i < products.size(); i++) { Product product = products.get(i); items[i] = product.getfoodName() + ":" + product.getfoodgram(); } ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_single_choice, items); listView.setAdapter(adapter); listView.setItemChecked(0, true); //getfoodName(),getfoodgram()をソートさせたい //getfoodName()はString型、getfoodgram()はdouble型 adapter.sort(new Comparator<Product>() { @Override public int compare(Product i1, Product i2) { return int.compare(i1.getfoodName(), i2.getfoodName()); } public int compare(Product i1, Product i2) { return int.compare(i1.getfoodgram(), i2.getfoodgram()); } }); db.close(); } }

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

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

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

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

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

dodox86

2020/12/08 10:55

とりあえず、ArrayAdapter<String> adapter は ArrayAdapter<Product> adapter; でないとダメなのではないでしょうか。そうした上でのadapter.sort(new Comparator<Product>() では。
karin10

2020/12/08 11:55

ArrayAdapter<Product> adapter;に変えると (this, android.R.layout.simple_list_item_single_choice, items);に赤線が入ってしまいます、、、
dodox86

2020/12/08 12:50

エラーになるのはわかるのですが、エラーを取るために修正するのではなく、やりたいことを実現するためにそのようにコードを修正するのです。今のままだと単純に、 adapter.sort(new Comparator<Product>() { @Override public int compare(Product i1, Product i2) { return 0; } }); としてもエラーになります。
dodox86

2020/12/08 12:57

今のままのコードですとArrayAdapterに結びつけているのはStringの配列なので、ソートの対象としたいgramの値が取れないと思います。foodのNameだけならソート対象にできますが。
karin10

2020/12/08 13:05

浅い考えですみませんでした。 foodのNameのソート方法についてご教授お願い致します。 foodgramのソートはそれを元に作成してみます。
guest

回答2

0

自己解決

ソートさせる内容がSQLiteに登録されているものだったので、
ソートさせる機能のコードを追加で書くのではなく、
SQLiteの登録情報を読み込むときに "order_by"を用いてデータベース情報をソートさせてから表示させるようにしました。

products = new ArrayList<Product>(); SQLiteDatabase db = helper.getReadableDatabase(); String order_by = "foodName ASC"; //コード追加 String[] columns = {"id", "foodName", "foodgram"}; Cursor cursor = db.query("Products", columns, null, null, null, null, order_by); //order_byの有効化

投稿2020/12/09 03:37

編集2020/12/09 03:40
karin10

総合スコア34

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

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

0

質問への追記・修正の依頼欄での[2021/12/08 22:05]のコメントより:

foodのNameのソート方法についてご教授お願い致します。
foodgramのソートはそれを元に作成してみます。

コメントで一部回答したように、質問者さんの現状のコードではArrayAdapterの生成時にArrayAdapter<String>...としているので、ArrayAdapter#sortでもStringの型同士でしか比較できません。その限りでコードを書くのであれば、String#compareToを使います。

Java

1adapter.sort(new Comparator<String>() { 2 @Override 3 public int compare(String s1, String s2) { 4 return s1.compareTo(s2); 5 } 6});

foodNameとfoodGramの双方を考慮した昇順のソートとなると、まずfoodNameを比較し、同じであれば更にfoodGramを比較するような合せ技になるかと思います。参考として以下のサンプルコードを載せておきます。Androidはとりあえず関係ないので、ターミナル上で実行できます。

Java

1// Main4.java 2import java.util.ArrayList; 3import java.util.Comparator; 4 5public class Main4 { 6 public static void main(String[]args) { 7 8 ArrayList<Product> prodList = new ArrayList<>(); 9 prodList.add(new Product("FoodC", 10.0)); 10 prodList.add(new Product("FoodA", 1.0)); 11 prodList.add(new Product("FoodB", 3.0)); 12 prodList.add(new Product("FoodB", 2.0)); 13 prodList.add(new Product("FoodB", 1.0)); 14 15 System.out.println("*** BEFORE:"); 16 for (Product prod: prodList) { 17 System.out.println(prod); 18 } 19 20 // 昇順にソート 21 prodList.sort(new Comparator<Product>() { 22 @Override 23 public int compare(Product p1, Product p2) { 24 int result = p1.getFoodName().compareTo(p2.getFoodName()); 25 if (result == 0) { 26 // FoodNameが同じであれば更にFoodGramを比較 27 if (p1.getFoodGram() < p2.getFoodGram()) { 28 result = -1; 29 } else if (p1.getFoodGram() > p2.getFoodGram()) { 30 result = 1; 31 } 32 } 33 34 return result; 35 } 36 }); 37 38 System.out.println("*** AFTER:"); 39 for (Product prod: prodList) { 40 System.out.println(prod); 41 } 42 } 43} 44 45class Product { 46 private String foodName; 47 private double foodGram; 48 49 public Product(String foodName, double foodGram) { 50 this.foodName = foodName; 51 this.foodGram = foodGram; 52 } 53 54 public String getFoodName() { 55 return this.foodName; 56 } 57 58 public double getFoodGram() { 59 return this.foodGram; 60 } 61 62 @Override 63 public String toString() { 64 return foodName + ":" + foodGram; 65 } 66} 67

foodNameが違っていればfoodGramを比較する必要が無いのは、foodNameがいわば上位桁に相当するので、そこで大小関係が決まってしまえばfoodGramを比較する必要はないからです。

これを実行すると以下の出力結果となります。昇順にソートされているのが分かるかと思います。

terminal

1$ java Main4 2*** BEFORE: 3FoodC:10.0 4FoodA:1.0 5FoodB:3.0 6FoodB:2.0 7FoodB:1.0 8*** AFTER: 9FoodA:1.0 10FoodB:1.0 11FoodB:2.0 12FoodB:3.0 13FoodC:10.0

投稿2020/12/08 14:38

編集2020/12/08 14:40
dodox86

総合スコア9256

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

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

karin10

2020/12/09 03:24

無事ソートされて表示されました! ただ、SQLiteに追加で登録した情報はソートされずに表示されてしまったり、ソート後に表示されている登録情報を選択すると別の登録情報が表示されたりなど何点かバグが発生しました。 しかし、dodox86様のコードのおかげで登録情報が表示されている画面のコードではなく、SQLiteでorder_byを有効にすることで登録情報をソートさせて表示できるのでは気付くことが出来ました。 質問で安直にSQLiteに関するコードを省いたこと申し訳ありません。(編集済み) foodgramにも対応したコードも書いていただりして頂いたにもかかわらず、申し訳ありません。
dodox86

2020/12/09 03:28 編集

> ただ、SQLiteに追加で登録した情報はソートされずに表示されてしまったり、 そりゃ当たり前です。質問自体、前提とやりたいことがもはや変わっています。ちょっとマナー違反ですね。(こちらの質問に限らず、よくあることですが)
karin10

2020/12/09 03:29

上手く説明できていなかったり、コードを省いてしまったりしていて申し訳ありませんでした。
dodox86

2020/12/09 03:36

当初、ArrayAdapterを使っているのは、画面表示後に「FoodName」「FoodGram」「FoodName + FoodGram」のいずれかで動的にソートさせたいのだと思いました。それゆえの回答です。結局解決できたのかできていないのか分かりませんが、私の回答とは違う方法で解決したのであれば自己回答、解決で構わないと思いますので、回答を閉じてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問