Выполнение этого кода должно быть результатом числа 6, так как я получаю только два значения из Data.snapshot [3,6]. но я продолжаю получать оба из них в такой форме: [3,6]. Есть ли что-то, что я делаю неправильно, или мое понимание извлеченного моментального снимка и HashMap неверно, и как я могу получить максимальную ценность?java ArrayList получает наибольшее значение
public void ratingCount(){
Firebase ref = new Firebase("https://CLOUD_NAME.firebaseio.com/rating/"+UserID);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
Map<String, String> ratings = (HashMap<String,String>) snapshot.getValue();
Collection<String> BulkValues = ratings.values();
ArrayList <String> values = new ArrayList<>();
values.add(BulkValues.toString());
Comparator<String> compare = new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
return Integer.valueOf(lhs).compareTo(Integer.valueOf(rhs));
}
};
textViewRatingValue.setText(Collections.max(values, compare));
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
Применение предложения Эранса, код;
public void onDataChange(DataSnapshot snapshot) {
Map<String, String> ratings = (HashMap<String,String>) snapshot.getValue();
Collection<String> BulkValues = ratings.values();
ArrayList <String> values = new ArrayList<>(BulkValues);
Comparator<String> compare = new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
return Integer.valueOf(lhs).compareTo(Integer.valueOf(rhs));
}
};
textViewRatingValue.setText(Collections.max(values, compare));
}
и ошибки:
04-06 13:07:37.353 31832-31832/net.we4x4.we4x4 E/AndroidRuntime: FATAL EXCEPTION: main
Process: net.we4x4.we4x4, PID: 31832
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
at net.we4x4.we4x4.MyInformation$7$1.compare(MyInformation.java:259)
at java.util.Collections.max(Collections.java:1629)
at net.we4x4.we4x4.MyInformation$7.onDataChange
Это потому, что он по-прежнему рассматривается как одной строки [3,6] и не могу сравнивать? или потому что я передаю его в textView «textViewRatingValue» неправильно?
Ну, благодаря точному объяснению Эрана, полученные данные являются «длинными», поэтому его необходимо указывать так, что это была вторая ошибка, которую я делал, и поэтому получение max проще, чем следующее;
Map<Long, Long> map = (HashMap<Long, Long>) snapshot.getValue();
Map<Long, Long> ratings = map;
Collection<Long> BulkValues = ratings.values();
ArrayList<Long> values = new ArrayList<>();
values.addAll(BulkValues);
Long max = Collections.max(values);
textViewRatingValue.setText(max.toString());
}
Ваше объяснение имеет смысл, но я обнаружил ошибку, применяя его, как вы могли видеть в моих обновлениях основного потока? это потому, что моментальный снимок HashMap является единственным, который можно выделить как одиночный String и не может сравниться? –
JanusJanus
Вы слишком быстро, снова проверьте LOL. Плюс я пробовал предложение «venu», но я вижу в своем коде, что он не учитывал тот факт, что я получаю данные из firebase в качестве моментального снимка, который, я думаю, является объектом, и я не ввожу данные в свой собственный, поэтому я попытался использовать его код, но я не был уверен, как это сделать, и если бы я сделал это правильно? – JanusJanus
@JanusJanus Ошибка, которую вы получили, подразумевает, что значение на карте моментальных снимков длиннее, а не String, поэтому приведение его к '(HashMap)', вероятно, неверно. Вы должны проверить фактические типы выполнения, которые вы получаете, и использовать правильные типы в своем коде. –
Eran