【问题标题】:How do I retrieve a random number from my saved file? (Java)如何从保存的文件中检索随机数? (爪哇)
【发布时间】:2016-07-08 13:24:38
【问题描述】:

我正在尝试制作一个 Android 应用程序,您可以在其中检查复选框并保存您的选择。保存有效,但是当我想从保存的数据中检索一个随机数时,我得到一个-1。谁能告诉我我做错了什么?

当我使用 Toast 显示消息时,它会给出我在 [] 之间选择的数字,所以它仍然是一个数组,对吗?

.java文件

public class MainActivity extends AppCompatActivity {

Button save, load;
TextView message;
String Message;
int data_block = 100;

static ArrayList<Integer> selection = new ArrayList<Integer>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    save = (Button) findViewById(R.id.save_button);
    load = (Button) findViewById(R.id.load);
    message = (TextView) findViewById(R.id.textView);
    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Message = selection.toString();
            try {
                FileOutputStream fou = openFileOutput("doubleArrayNumbers.txt", MODE_WORLD_READABLE);
                OutputStreamWriter osw = new OutputStreamWriter(fou);
                try {
                    osw.write(Message);
                    osw.flush();
                    osw.close();
                    Toast.makeText(getBaseContext(), "Data Saved", Toast.LENGTH_SHORT).show();

                } catch (IOException e) {
                    e.printStackTrace();
                }

            } catch (FileNotFoundException e) {

                e.printStackTrace();
            }
        }
    });

    load.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            try {
                FileInputStream fis = openFileInput("doubleArrayNumbers.txt");
                InputStreamReader isr = new InputStreamReader(fis);
                char[] data = new char[data_block];
                String final_data = "";
                int size;
                try {
                    while ((size = isr.read(data)) > 0) {
                        String read_data = String.copyValueOf(data, 0, size);
                        final_data += read_data;
                        data = new char[data_block];
                    }

                    if(final_data.length() == 0){
                        Toast.makeText(MainActivity.this, "You need to pick a selection first", Toast.LENGTH_SHORT).show();
                    } else{
                       // Toast.makeText(getBaseContext(), "Message : " + final_data, Toast.LENGTH_SHORT).show();
                        Random doubleNumberRandom = new Random();
                        int number = final_data.indexOf(doubleNumberRandom.nextInt(final_data.length()));
                        TextView myText = (TextView) findViewById(R.id.textView);
                        String myString = String.valueOf(number);
                        myText.setText(myString);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    });

}

public void selectNumber(View view) {
    boolean numberChecked = ((CheckBox) view).isChecked();
    switch (view.getId()) {
        case R.id.number_D1:
            if (numberChecked) {
                selection.add(new Integer(1));
            }else{
                selection.remove(new Integer(1));

            }
            break;
        case R.id.number_D2:
            if (numberChecked) {
                selection.add(new Integer(2));
            } else {
                selection.remove(new Integer(2));
            }
            break;

        case R.id.number_D3:
            if (numberChecked) {
                selection.add(new Integer(3));
            } else {
                selection.remove(new Integer(3));
            }
            break;

        case R.id.number_D4:
            if (numberChecked) {
                selection.add(new Integer(4));
            } else {
                selection.remove(new Integer(4));
            }
            break;

        case R.id.number_D5:
            if (numberChecked) {
                selection.add(new Integer(5));
            } else {
                selection.remove(new Integer(5));
            }
            break;

        case R.id.number_D6:
            if (numberChecked) {
                selection.add(new Integer(6));
            } else {
                selection.remove(new Integer(6));
            }
            break;

        case R.id.number_D7:
            if (numberChecked) {
                selection.add(new Integer(7));
            } else {
                selection.remove(new Integer(7));
            }
            break;

        case R.id.number_D8:
            if (numberChecked) {
                selection.add(new Integer(8));
            } else {
                selection.remove(new Integer(8));
            }
            break;

        case R.id.number_D9:
            if (numberChecked) {
                selection.add(new Integer(9));
            } else {
                selection.remove(new Integer(9));
            }
            break;

        case R.id.number_D10:
            if (numberChecked) {
                selection.add(new Integer(10));
            } else {
                selection.remove(new Integer(10));
            }
            break;


    }
}

}

.xml文件

 <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.developer.sven.seceltiedartworkout.MainActivity">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:textAppearanceLarge"
    android:text="Dart Workout"
    android:id="@+id/textView"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="83dp"
    android:layout_alignParentBottom="true"
    android:layout_alignEnd="@+id/load" />
<Button
    android:layout_width="125dp"
    android:layout_height="125dp"
    android:text="D"
    android:textSize="50dp"
    android:id="@+id/load"
    android:onClick="DoubleButton"
    android:background="#0a07c5"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    android:layout_marginTop="37dp" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save"
    android:id="@+id/save_button"
    android:layout_centerVertical="true"
    android:layout_alignEnd="@+id/load" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:id="@+id/number_D1"
    android:text="D1"
    android:onClick="selectNumber"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:id="@+id/number_D2"
    android:text="D2"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:layout_below="@+id/number_D1"
    android:layout_alignParentLeft="true"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:id="@+id/number_D3"
    android:text="D3"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:layout_below="@+id/number_D2"
    android:layout_alignParentLeft="true"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:id="@+id/number_D4"
    android:text="D4"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:layout_below="@+id/number_D3"
    android:layout_alignParentLeft="true"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:id="@+id/number_D5"
    android:text="D5"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:layout_below="@+id/number_D4"
    android:layout_alignParentLeft="true"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:text="D6"
    android:id="@+id/number_D6"
    android:layout_below="@+id/number_D5"
    android:layout_alignParentStart="true"
    android:checked="false"
    android:onClick="selectNumber"/>

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:text="D7"
    android:id="@+id/number_D7"
    android:layout_below="@+id/number_D6"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:text="D8"
    android:id="@+id/number_D8"
    android:layout_below="@+id/number_D7"
    android:layout_alignParentStart="true"
    android:onClick="selectNumber"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:text="D9"
    android:id="@+id/number_D9"
    android:layout_below="@+id/number_D8"
    android:layout_alignEnd="@+id/number_D8"
    android:onClick="selectNumber"
    android:checked="false" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="21dp"
    android:text="D10"
    android:id="@+id/number_D10"
    android:layout_below="@+id/number_D9"
    android:onClick="selectNumber"
    android:checked="false" />

</RelativeLayout>

【问题讨论】:

    标签: java android android-studio arraylist save


    【解决方案1】:

    改变了我的整个答案!

    您应该能够看到替换代码的位置。可以对“[”和“]”字符进行 srtiped,然后在“,”上拆分以获得字符串数组(现在它们已被索引,我认为更接近您的原始意图)。

    String csv = final_data.replaceAll("\\[|\\]|s", "");
    String[] numbers = csv.split(",");
    // Toast.makeText(getBaseContext(), "Message : " + final_data, Toast.LENGTH_SHORT).show();
    Random doubleNumberRandom = new Random();
    String number = numbers[doubleNumberRandom.nextInt(numbers.length)];
    TextView myText = (TextView) findViewById(R.id.textView);
    myText.setText(number);
    

    您现在可以在numbers 中生成一个随机索引,并将生成的数字字符串直接设置到您的文本视图中。

    【讨论】:

    • 你好 Maio Liu,它几乎可以正常工作,但不是我想要的方式。如果我使用 (int number) 我会得到奇怪的结果,例如 D32 - D91 -D53 等,而不是我给它的选择。如果我使用的是(字符编号),则数字是正确的,只有“,”和“[]”也显示在文本视图中。有没有办法解决这个问题
    • 我更新了我的答案。我运行了你的代码来弄清楚你在做什么,因为没有示例图片或任何东西,而且我并不擅长快速解释我脑海中的 xml。无论如何,这是一种方法。某种“更改最少的代码行以破坏事物”之类的解决方案。不过,这整个方法有点重新发明轮子。您可以使用Lists 的serializable 属性来完成这项工作。查看this,如果您需要示例,请联系我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2018-05-01
    • 2016-05-28
    相关资源
    最近更新 更多