#java #android #string #arraylist #split
#java #Android #строка #список массивов #разделение
Вопрос:
Мне нужно создать список массивов строк из другого списка массивов строк, разделив строки из первой во вторую. Данные поступают из файла .txt, считываемого BufferedReader. Предполагается, что это приложение отображает счетчик, из которого пользователь может выбрать имя учащегося, затем вычислить его оценку и отобразить ее. Самое большое препятствие сейчас заключается в том, что я получаю исключение нулевого указателя при попытке использовать .split. Как вы, вероятно, можете сказать, я довольно новичок в этом и мог бы использовать некоторую помощь. Спасибо!
grades.txt
Name Test1 Test2 Test3 Final
Adam Anderson 81 90 85 87
Ben Brown 77 80 68 94
Chris Cross 74 80 56 62
Don Dare 86 94 90 89
Eric Earl 96 93 90 98
Fred Foley 79 92 59 86
Gina Gray 80 83 95 87
Holly Hank 74 77 75 78
Ian Ingram 66 64 56 60
Jill Johnson 90 98 78 89
код java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String strName, strLastName, strFirstName, strFinalGrade;
int intTest1, intTest2, intTest3, intFinal, intFinalGrade;
int intPointsPossible = 400;
int finalGrades[] = new int[0];
AssetManager am = getAssets();
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> finalList = finalList = new ArrayList<String>();
BufferedReader reader;
String line = " ";
String item = " ";
try {
InputStream input = am.open("grades.txt");
reader = new BufferedReader(new InputStreamReader(input));
while (line != null){
line = reader.readLine();
list.add(line);
}
while (item != null){
for (int i = 0; i < list.size(); i ){
line.split("\s ");
finalList.add(item);
}
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
Spinner spinner = new Spinner(this);
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
spinner.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
}}
Комментарии:
1.
line.split("\s ");
возвращает aString[]
, вы должны что-то с этим делать?2.
while (item != null)
… это бесконечный цикл
Ответ №1:
Самое большое препятствие сейчас заключается в том, что я получаю исключение нулевого указателя при попытке использовать .split
Вы запускаете while (line != null){
Это означает, что для того, чтобы этот цикл остановился, line
будет null
.
Давайте предположим, что это опечатка….
ArrayList<String> finalList = finalList = new ArrayList<String>();
В любом случае, вы можете Arrays.asList(line.split("\s ")
получить список, который вы можете addAll
в finalList
.
BufferedReader reader;
try {
InputStream input = am.open("grades.txt");
reader = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("\s ");
finalList.addAll(Arrays.asList(parts));
}
input.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) reader.close();
}
Хотя, на самом деле, я не думаю, что это то, чего вы хотите. потому что
Предполагается, что это приложение отображает счетчик, из которого пользователь может выбрать имя учащегося, затем вычислить его оценку и отобразить ее
Вероятно, каждая строка должна быть преобразована в Student
объект, затем finalList
может быть List<Student>
public class Student {
String firstName, lastName;
int test1, test2, test3, final; // or List<Integer> tests;
}
Затем вам нужно ArrayAdapter<Student>
, чтобы вы могли настроить отображение только имени учащегося.
Далее вам понадобится прослушиватель выбора элементов в счетчике для вычисления и отображения оценок по действию.
Однако это отдельные проблемы, для которых вам следует опубликовать новые вопросы.
Тогда у вас есть Spinner spinner = new Spinner(this);
, но этот счетчик не исходит из вашего XML-макета … возможно, вам следует использовать findViewById
для получения счетчика, который
Комментарии:
1. Спасибо! По крайней мере, теперь у меня есть направление!