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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

859閲覧

SharedPreferenceで以前入力した数字を検索したい

Eston

総合スコア67

Java

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/04/30 09:49

編集2020/04/30 10:20

いつも、お世話になっております。

現在、数字を入力すると、フィボナッチ数列を還すアプリを作成しています
はじめはFirebaseを利用していましたが、今回は練習としてSharedPreferencesを利用しようとしています

目標
・入力された数字が、以前にも入力された数字である場合、もう一度フィボナッチ数列を計算するのではなくて、SharedPreferencesに保存された(入力された数字 : フィボナッチ数列)から、数列を取り出して、別のアクティビティに表示する

SharedPreferenceに保存することはできたのですが、入力された数字が以前に入力されたかどうか、判断する方法が検討つきません

ご教授いただけると幸いです。

開発環境
Android Studio 3.6.1
MacOS Catalina 1.15.4
Java

数字入力画面↓
数字入力画面

フィボナッチ数列の表示画面↓
イメージ説明

MainActivity.java(数字入力画面コード)↓

package com.ljuv.fibonacciapp.activities; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.ljuv.fibonacciapp.R; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { final Context context = this; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button okButton = findViewById(R.id.button_ok); final EditText fibonacciSeq = findViewById(R.id.tv_fibonacci_sequence); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!fibonacciSeq.getText().toString().isEmpty()) { Intent intent = new Intent(context, FibonacciListActivity.class).putExtra("nums", Integer.parseInt( fibonacciSeq.getText().toString()) ); startActivity(intent); } } }); } }

FibonacciListActivity.java(フィボナッチ数列の表示画面コード)↓

package com.ljuv.fibonacciapp.activities; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.widget.TextView; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.ljuv.fibonacciapp.utils.FibonacciNumbersCalculator; import com.ljuv.fibonacciapp.R; import com.ljuv.fibonacciapp.lists.RecyclerViewFibonacciAdapter; import java.util.ArrayList; import java.util.List; public class FibonacciListActivity extends AppCompatActivity { TextView loadingView; RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fibonacci_list); recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); int nums = getIntent().getIntExtra("nums", 1); //int iterations = 100; //このメソッドでフィボナッチが計算されているんので、この前に入力された数字を検索する必要がある ArrayList<Long> fibList = FibonacciNumbersCalculator.getNums(nums); RecyclerViewFibonacciAdapter adapter = new RecyclerViewFibonacciAdapter(fibList); recyclerView.setAdapter(adapter); Gson gson = new Gson(); SharedPreferences sharedPreferences = getSharedPreferences("MySharedPref", MODE_PRIVATE); SharedPreferences.Editor myEdit = sharedPreferences.edit(); //入力された数字を保存 myEdit.putInt( "inputNum", nums); //計算語の配列を保存 myEdit.putInt( "fibAfterCalc", Integer.parseInt( gson.toJson(fibList))); //データベースの中は 「12(入力された数字): 01123581321345589(フィボナッチ)数列」 myEdit.putInt( "fibAfterCalc", Integer.parseInt( gson.toJson(fibList))); //myEdit.putString("", gson.toJson(fibList)); //myEdit.commit(); } }

FibonacciNumberCalculator.java(フィボナッチ計算コード)↓

package

1 2 3import android.content.SharedPreferences; 4 5import com.google.gson.Gson; 6 7import java.util.ArrayList; 8 9public class FibonacciNumbersCalculator { 10 11 public static ArrayList<Long> getNums(int count) { 12 long first = 0; 13 long second = 1; 14 15 ArrayList<Long> list = new ArrayList<>(count); 16 17 list.add(first); 18 list.add(second); 19 20 long prev = 0; 21 long prev2 = 1; 22 long current; 23 for( int i = 2; i< count; ++i) { 24 current = prev + prev2; 25 list.add(current); 26 prev = prev2; 27 prev2 = current; 28 } 29 return list; 30 } 31 32} 33

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

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

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

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

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

jimbe

2020/04/30 10:08

> 判断する所で躓いております どう躓いているのでしょうか.
Eston

2020/04/30 10:24

大変申し訳ありません。自分でもその部分、質問を分解できていませんでした。
guest

回答2

0

ベストアンサー

まず, SharedPreferences はデータベースのようにデータを保存するものでは無いことは先にお断りしておきます.

Gson によって Json 形式での保存をされるようですので, Map をそのまま SharedPreferences に保存してしまえば良いのではと思います.
以下のコードでは, ログに "new Calc"/"DB Found" と表示させています.
(EditText の設定がテキトウなため操作はし難いかと思いますが, サンプルということでご了承ください.)

java

1package com.teratail.q257732; 2 3import androidx.annotation.NonNull; 4import androidx.appcompat.app.AppCompatActivity; 5import androidx.recyclerview.widget.*; 6 7import android.content.*; 8import android.os.Bundle; 9import android.util.Log; 10import android.view.*; 11import android.widget.*; 12 13import com.google.gson.Gson; 14import com.google.gson.reflect.TypeToken; 15 16import java.util.*; 17 18public class MainActivity extends AppCompatActivity { 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 final Database database = new Database(this); 25 26 final RecyclerView recyclerView = findViewById(R.id.recyclerView); 27 recyclerView.setLayoutManager(new LinearLayoutManager(this)); 28 recyclerView.setAdapter(new FibonacciAdapter(this)); 29 30 EditText edittext = findViewById(R.id.edittext); 31 Button button = findViewById(R.id.button); 32 button.setOnClickListener(new View.OnClickListener() { 33 @Override 34 public void onClick(View v) { 35 EditText edittext = findViewById(R.id.edittext); 36 try { 37 int count = Integer.parseInt(edittext.getText().toString()); 38 List<Long> fibonacci = database.get(count); 39 if(fibonacci == null) { 40 Log.d("Fibonacci", "new Calc."); 41 fibonacci = FibonacciNumbersCalculator.getNums(count); 42 database.put(count, fibonacci); 43 } else { 44 Log.d("Fibonacci", "DB Found."); 45 } 46 recyclerView.setAdapter(new FibonacciAdapter(MainActivity.this, fibonacci)); 47 } catch(NumberFormatException e) { 48 Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG); 49 } 50 } 51 }); 52 } 53 static class FibonacciAdapter extends RecyclerView.Adapter { 54 private static class FibonacciViewHolder extends RecyclerView.ViewHolder { 55 private TextView text1; 56 public FibonacciViewHolder(@NonNull View itemView) { 57 super(itemView); 58 text1 = itemView.findViewById(android.R.id.text1); 59 } 60 } 61 private Context context; 62 private List<Long> list = Collections.emptyList(); 63 64 FibonacciAdapter(Context context) { 65 this.context = context; 66 } 67 FibonacciAdapter(Context context, List<Long> fibonacci) { 68 this.context = context; 69 list = fibonacci; 70 } 71 @NonNull 72 @Override 73 public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 74 View itemView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false); 75 return new FibonacciViewHolder(itemView); 76 } 77 @Override 78 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 79 ((FibonacciViewHolder)holder).text1.setText((position+1)+". "+list.get(position)); 80 } 81 @Override 82 public int getItemCount() { 83 return list.size(); 84 } 85 } 86 static class Database { 87 private static String KEY = "fibonacciMap"; 88 private SharedPreferences sharedPreferences; 89 private Map<Integer,List<Long>> map = new HashMap<>(); 90 Database(Context context) { 91 sharedPreferences = context.getSharedPreferences("MySharedPref", MODE_PRIVATE); 92 String json = sharedPreferences.getString(KEY, null); 93 if(json != null) { 94 Gson gson = new Gson(); 95 map = gson.fromJson(json, new TypeToken<HashMap<Integer,List<Long>>>(){}.getType()); 96 } 97 } 98 void put(int count, List<Long> fibonacci) { 99 map.put(count, fibonacci); 100 SharedPreferences.Editor edit = sharedPreferences.edit(); 101 Gson gson = new Gson(); 102 edit.putString(KEY, gson.toJson(map)); 103 edit.commit(); 104 } 105 List<Long> get(int count) { 106 return map.get(count); 107 } 108 } 109 static class FibonacciNumbersCalculator { 110 public static List<Long> getNums(int count) { 111 long first = 0; 112 long second = 1; 113 114 List<Long> list = new ArrayList<>(count); 115 116 list.add(first); 117 list.add(second); 118 119 long prev = 0; 120 long prev2 = 1; 121 long current; 122 for( int i = 2; i< count; ++i) { 123 current = prev + prev2; 124 list.add(current); 125 prev = prev2; 126 prev2 = current; 127 } 128 return list; 129 } 130 } 131}

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 <LinearLayout 9 android:id="@+id/head" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 app:layout_constraintLeft_toLeftOf="parent" 13 app:layout_constraintRight_toRightOf="parent" 14 app:layout_constraintTop_toTopOf="parent"> 15 <EditText 16 android:id="@+id/edittext" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:ems="10" /> 20 <Button 21 android:id="@+id/button" 22 android:text="計算" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" /> 25 </LinearLayout> 26 <androidx.recyclerview.widget.RecyclerView 27 android:id="@+id/recyclerView" 28 android:layout_width="match_parent" 29 android:layout_height="0dp" 30 app:layout_constraintBottom_toBottomOf="parent" 31 app:layout_constraintLeft_toLeftOf="parent" 32 app:layout_constraintRight_toRightOf="parent" 33 app:layout_constraintTop_toBottomOf="@id/head" /> 34</androidx.constraintlayout.widget.ConstraintLayout>

投稿2020/04/30 11:58

jimbe

総合スコア12646

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

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

0

入力された数字が、以前にも入力された数字である場合、もう一度フィボナッチ数列を計算するのではなくて、SharedPreferencesに保存された(入力された数字 : フィボナッチ数列)から、数列を取り出して、別のアクティビティに表示する

ひとつの整数を保存したいのか、あるいは数列を保存したいのか分かりませんが、保存済みかどうかはおよそ以下のような考え方で判断できるはずです。

SharedPreferencesで保存した値は(恐らく)ご存じのようにgetInt(String key, int defValue)などのメソッドで取得できる訳ですが、

[SharedPreferences - Android Developers Docs]((https://developer.android.com/reference/android/content/SharedPreferences)

既に保存済みかどうかは、SharedPreferences#contains(String key)でキーが既に存在するか(保存済みか)で判断するか、あるいはひとつの整数であれば、SharedPreferences#getInt(String key, int defValue)でデフォルトの値にあり得ない値をセットし、実行することで保存済みかどうかを判断できるでしょう。デフォルトのあり得ない値が返ってくれば保存されていはいないし、デフォルトではない値が返ってくれば、それは保存されている値、と言うことになります。

投稿2020/04/30 10:19

dodox86

総合スコア9183

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

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

Eston

2020/04/30 10:23

回答ありがとうございます。 保存したいのは両方という認識でお願いいたします 12が入力された場合、12をkeyとして01123581321345589と配列が保存されます DB内は(12|01123581321345589) 再度12が入力されたのであれば、既にSharedPreferenceに保存されている「01123581321345589」を取り出すということになります。
dodox86

2020/04/30 10:24

両方でも考え方は同じです。キーが存在するか否か。あとは取り出した値を処理すればよいだけです。
Eston

2020/04/30 10:29

すいません、最初はコメントを咀嚼できていませんでした。もう少し深堀りして試してみます。コメントありがとうございます。
dodox86

2020/04/30 10:35

数列を収める際、各要素の区切りを意識するために配列のイメージになると思いますが、SharedPreferencesのメソッドでは配列を直接扱うものが無いので、例えばカンマ区切りの文字列に 直して保存し、再読み込みする際にカンマ区切りで文字列から整数に変換して戻す、ようなことも考えられます。フィボナッチ数列を永遠に求められるようにしたいのでしょうから、どれだけ長い文字列を収められるかちょっと心配になりますが。(私自身はそのように極端に長い文字列を保存したことはありません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問