检索最高值的java ArrayList
由于我只从Data.snapshot[3,6]中检索两个值,因此执行此代码应该是结果6。但我一直以这种形式得到它们:[3,6]。 是否有什么地方我做错了,或者我对提取的快照和HashMap的理解不正确,以及如何获得最高值检索最高值的java ArrayList,java,android-studio,arraylist,collections,hashmap,Java,Android Studio,Arraylist,Collections,Hashmap,由于我只从Data.snapshot[3,6]中检索两个值,因此执行此代码应该是结果6。但我一直以这种形式得到它们:[3,6]。 是否有什么地方我做错了,或者我对提取的快照和HashMap的理解不正确,以及如何获得最高值 public void ratingCount(){ Firebase ref = new Firebase("https://CLOUD_NAME.firebaseio.com/rating/"+UserID); ref.addValueEventL
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) {
}
});
}
是否因为它仍然被视为一个字符串[3,6],无法进行比较?还是因为我以错误的方式将其传递给textView“textViewRatingValue”
好的,由于Eran的精确解释,检索到的数据是“长”的,因此必须这样表示,这是我犯的第二个错误,这样做得到最大值更简单,如下所示:
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());
}
Map=(HashMap)snapshot.getValue();
地图评级=地图;
集合值=ratings.values();
ArrayList值=新的ArrayList();
values.addAll(BulkValues);
Long max=Collections.max(值);
textViewRatingValue.setText(最大toString());
}
您正在将单个元素添加到值中,该元素是集合的字符串表示形式(在您的示例中为字符串“[3,6]”):
如果要添加所有元素,请使用:
values.addAll(BulkValues);
或者只需将值声明为:
ArrayList <String> values = new ArrayList<>(BulkValues);
ArrayList值=新的ArrayList(BulkValues);
在这里,您要将total数组添加为字符串(values.add(BulkValues.toString())
。相反,您需要像这样使用addAll
values.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));
}
希望它能对您有所帮助。您的解释很有道理,但是我在应用它时遇到了一个错误,您可以在我的主线程更新中看到这一点吗?是因为哈希图快照,是一个单一的字符串提取,不能比较?你太快,再检查LOL。此外,我尝试过“Viu”建议,但我看到在他的代码中,他没有考虑的事实,我正在接收的数据作为一个快照从FialBasic,我猜它是一个对象,我不是输入数据在我自己,因此,我尝试使用他的代码,但我不确定如何使用,如果我做得正确?@JanusJanus您得到的错误意味着快照中的值是长的,而不是字符串,因此将其转换为(HashMap)
可能是错误的。你应该检查你得到的实际运行时类型,并在你的代码中使用正确的类型。我希望你能耐心听我说,因为我对一些事情不太熟悉,我如何检查运行时类型?甚至当我试图将代码中的所有“字符串”都改为Long时,最后我在下面的“比较”中得到了一条红色下划线:textViewRatingValue.setText(Collections.max(values,compare))@JanusJanus如果值是列表
,则不需要比较器。只需使用Collections.max(values)
。我尝试了您的建议,但我从firebase接收到的数据是快照,我猜它是一个对象,因此不确定如何传递数据,如果我做得正确?@JanusJane抱歉,我没有正确观察。这里我猜snapshot.getValue()返回具有长值的Hashmap对象,但您将其分配给Hashmap,这是错误的。。所以您需要这样做(Hashmap)ratings.value();是的,谢谢@venu,现在工作,理解了这个概念。
values.addAll(BulkValues);
ArrayList <String> values = new ArrayList<>(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