2016-04-06 2 views
1

Выполнение этого кода должно быть результатом числа 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()); 
     } 

ответ

2

Вы добавляете один элемент к values, который является String представление этой CollectionString "[3,6]" в вашем случае):

values.add(BulkValues.toString()); 

Если вы хотите добавить все элементы, использование:

values.addAll(BulkValues); 

или просто объявить values как:

ArrayList <String> values = new ArrayList<>(BulkValues); 
+0

Ваше объяснение имеет смысл, но я обнаружил ошибку, применяя его, как вы могли видеть в моих обновлениях основного потока? это потому, что моментальный снимок HashMap является единственным, который можно выделить как одиночный String и не может сравниться? – JanusJanus

+0

Вы слишком быстро, снова проверьте LOL. Плюс я пробовал предложение «venu», но я вижу в своем коде, что он не учитывал тот факт, что я получаю данные из firebase в качестве моментального снимка, который, я думаю, является объектом, и я не ввожу данные в свой собственный, поэтому я попытался использовать его код, но я не был уверен, как это сделать, и если бы я сделал это правильно? – JanusJanus

+1

@JanusJanus Ошибка, которую вы получили, подразумевает, что значение на карте моментальных снимков длиннее, а не String, поэтому приведение его к '(HashMap )', вероятно, неверно. Вы должны проверить фактические типы выполнения, которые вы получаете, и использовать правильные типы в своем коде. – Eran

1

Здесь вы добавляете полный массив в виде строки (values.add(BulkValues.toString())). вместо этого вам необходимо использовать addAllvalues.addAll(BulkValues);

См. ниже пример.

Map<String, String> map=new HashMap<>(); 
      map.put("one", "1"); 
      map.put("six", "6"); 
      map.put("three", "3"); 
      map.put("nine", "9"); 
      map.put("seven", "7"); 
      Map<String, String> ratings =map; 
      Collection<String> BulkValues = ratings.values(); 
      ArrayList <String> values = new ArrayList<>(); 
      values.addAll(BulkValues); 

      Comparator<String> compare = new Comparator<String>() { 
       @Override 
       public int compare(String lhs, String rhs) { 
        return Integer.valueOf(lhs).compareTo(Integer.valueOf(rhs)); 
       } 
      }; 

      System.out.println(Collections.max(values, compare)); 
      } 

выход:

9 

Надеется, что это поможет.

+0

Я пробовал ваше предложение, но я получаю данные от firebase как моментальный снимок, который, я думаю, является объектом, поэтому не знаю, как передать данные, и если Я сделал это правильно? – JanusJanus

+1

@JanusJanes Извините, я не наблюдал должным образом. Я предполагаю, что snapshot.getValue() возвращает объект Hashmap с длинными значениями, но вы назначаете Hashmap , это неправильно. Поэтому вам нужно сделайте так (Hashmap ) ratings.value(); – Venu

+0

Да, спасибо @venu, теперь работал и понял концепцию. – JanusJanus

Смежные вопросы