这是我的数据库:
对于每个类别,应该返回“总投票数”最高的候选人。
这是我的代码:
Query presidentquery = reference.child("candidates").orderByChild("category").equalTo("President");
presidentquery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
String firstname = dataSnapshot1.child("firstname").getValue(String.class);
String lastname = dataSnapshot1.child("lastname").getValue(String.class);
Long tvotes = dataSnapshot1.child("totalVotes").getValue(Long.class);
pres.setText(firstname + " " + lastname+" - "+tvotes+" Votes");
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
而不是返回投票率最高的候选人,而是返回最近的候选人。如何在数据快照中过滤结果以显示具有最高“ totalVotes”的候选人。
谢谢
我复制了您的问题,并找到了一种获得最高票数的候选人的方法。
在模型类中添加以下方法。
@Override
public int compareTo(Candidate o) {
return (this.getTotalVotes() > o.getTotalVotes() ? -1 :
(this.getTotalVotes() == o.getTotalVotes() ? 0 : 1));
}
要覆盖compareTo方法,您需要通过implements Comparable<Candidate>
实现Comparable类>
创建一个用于对值进行排序的类
public class Sorter { ArrayList<Candidate> candidateList = new ArrayList<>(); public Sorter(ArrayList<Candidate> candidateList) { this.candidateList = candidateList; } public ArrayList<Candidate> sortByTotalVotes() { Collections.sort(candidateList); return candidateList; } }
在您的Activity类中,添加
这里,您需要将从数据库中获取的所有数据添加到数组列表中。添加完所有数据后,您需要对数据进行排序并显示结果。
Query query = databaseReference.child("candidates").orderByChild("category").equalTo("President");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ArrayList<Candidate> candidates = new ArrayList<>();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
int id = dataSnapshot1.child("totalVotes").getValue(Integer.class);
String firstName = dataSnapshot1.child("firstName").getValue(String.class);
String lastName = dataSnapshot1.child("lastName").getValue(String.class);
candidate = new Candidate(firstName, lastName, id);
candidates.add(candidate);
}
Sorter sorter = new Sorter(candidates);
ArrayList<Candidate> candidateArrayList = sorter.sortByTotalVotes();
System.out.println("Max value: " + candidateArrayList.get(0));
System.out.println("Printing the sorted values----------------");
for (Candidate candidate : candidateArrayList) {
System.out.println(candidate);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});