我要用保存的双值进行平均值,我得到一个评级栏。当用户按下一个按钮时,我的应用程序会保存评级栏编号(双倍)并做一个平均值我有一个List
(读取代码本身),我用文件中的双值填充。问题是平均回报,因为它返回NaN
。我认为我的问题是写代码,因为NaN
“意味着”我正在进行除以0.我是初学者,这意味着当我查看代码时我看不到错误,很抱歉,问题很容易解决。我现在将显示代码(对不起任何错误,我不经常写英文)。
写入/读取代码(该文件名为asdfg.txt
,因为它给了我错误,所以如果它解决了,我会改变它。)
private void writeMyArray(double rate) {
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("asdfg.txt", true)))) {
out.println(Double.toString(rate));
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
private List<Double> readMyArray() {
List<Double> list = new ArrayList<Double>();
try {
Scanner s = new Scanner(new FileInputStream("asdfg.txt"), "utf-8");
while (s.hasNextLine()) {
list.add(Double.parseDouble(s.nextLine()));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return list;
}
平均值(媒体表示我母语的平均值):
private double media(List<Double> rateList) {
double averageRating = 0;
for (double r : rateList) {
averageRating = averageRating + r;
}
return averageRating / rateList.size();
}
按钮代码(readFromFile()
返回评级栏,我正在写入列表两次,因为它是一个列表,我想把更多的值放在那里,只是为了测试,当我完成这个我会写的时候一次):
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rating = ratingbar.getRating();
writeToFile(Double.toString(rating));
writeMyArray(Double.parseDouble(readFromFile()));
writeMyArray(ratingbar.getRating());
button.setText(getText(R.string.obrigado) + "!" + media(readMyArray()));
}
});´
已编辑:因为已请求,我正在发布活动代码和资源:
活动(没有添加导入,太多)
public class MainActivity extends ActionBarActivity {
Toolbar toolbar;
TextView textView;
double rating;
public Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RatingBar ratingbar = (RatingBar) findViewById(R.id.ratingBar);
button = (Button) findViewById(R.id.button);
button.setText(getText(R.string.ultimo) + " " + readFromFile());
ratingbar.setEnabled(true);
rating = 0;
textView = (TextView) findViewById(R.id.textView2);
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
TextView comodia = (TextView) findViewById(R.id.comodia);
comodia.setText(getText(R.string.notification_text));
ratingbar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
button.setText(getText(R.string.votar) + ":");
button.setEnabled(true);
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rating = ratingbar.getRating();
writeToFile(Double.toString(rating));
writeMyArray(Double.parseDouble(readFromFile()));
writeMyArray(ratingbar.getRating());
button.setText(getText(R.string.obrigado) + "!" + readFromFile() + " " + media(readMyArray()));
}
});
}
private void writeToFile(String data) {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("estrela.txt", Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();
} catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}
private String readFromFile() {
String ret = "";
try {
InputStream inputStream = openFileInput("estrela.txt");
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String receiveString = "";
StringBuilder stringBuilder = new StringBuilder();
while ((receiveString = bufferedReader.readLine()) != null) {
stringBuilder.append(receiveString);
}
inputStream.close();
ret = stringBuilder.toString();
}
} catch (FileNotFoundException e) {
Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
Log.e("login activity", "Can not read file: " + e.toString());
}
return ret;
}
private void writeMyArray(double rate) {
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("asdfg.txt", true)))) {
out.println(Double.toString(rate));
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
private List<Double> readMyArray() {
List<Double> list = new ArrayList<Double>();
try {
Scanner s = new Scanner(new FileInputStream("asdfg.txt"), "utf-8");
while (s.hasNextLine()) {
list.add(Double.parseDouble(s.nextLine()));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return list;
}
private double media(List<Double> rateList) {
double averageRating = 0;
for (double r : rateList) {
averageRating = averageRating + r;
}
if (averageRating == 0) {
return 189;
} else {
return averageRating / (double)rateList.size();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
onCreate(null);
return true;
}
return super.onOptionsItemSelected(item);
}
}
RES /字符串:
<resources>
<string name="app_name">Day Rating</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="segunda">Hoje é segunda-feira!</string>
<string name="terca">Hoje é terça-feira!</string>
<string name="quarta">Hoje é quarta-feira!</string>
<string name="quinta">Hoje é quinta-feira!</string>
<string name="sexta">Hoje é sexta-feira!</string>
<string name="sabado">Hoje é sábado!</string>
<string name="domingo">Hoje é domingo!</string>
<string name="bomdia">Bom dia</string>
<string name="notification_text">Como está a ser o seu dia?</string>
<string name="notification_ticker">Como se sente?</string>
<string name="ultimo">Último</string>
<string name="votar">Votar</string>
<string name="obrigado">Obrigado</string>