gpt4 book ai didi

java - 如何找到玩家上传数据中最大的值(value)

转载 作者:行者123 更新时间:2023-12-02 09:32:54 25 4
gpt4 key购买 nike

我正在尝试为我的应用程序制作一个高分类型的工具,因此我正在使用一些代码,但无法弄清楚如何搜索多个节点以找到最大的值(value)。问题似乎是 DataSnapshot 将节点读取为 HashMap,并且将值转换为 int 时没有问题。如何读取信息(玩家姓名和玩家分数),让 DataSnapshot 识别最大值并将电视设置为该值?

我尝试过的代码如下。我还将添加我的 Firebase 外观的屏幕截图,使其在视觉上更易于理解

我的 WriteToFirebase Activity

public void gFirebase(View view){

int score = (int) (Math.random() * ((50)+1));
Player p1 = new Player();
p1.setName("Player 1");
p1.setScore(score);

DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

gameInfoRef.setValue(p1);

}

public void lFirebase(View view){

int score = (int) (Math.random() * ((50)+1));
Player p2 = new Player();
p2.setName("Player 2");
p2.setScore(score);

DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

gameInfoRef.setValue(p2);

}

public void sFirebase(View view){

int score = (int) (Math.random() * ((50)+1));
Player p3 = new Player();
p3.setName("Player 3");
p3.setScore(score);

DatabaseReference roofRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameInfoRef = roofRef.child("hiscore").child("player_name").push();

gameInfoRef.setValue(p3);


}

我的 ReadFromFirebase Activity

public void readFromFirebase(View view) {

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference hiscoreRef = rootRef.child("hiscore").child("player_name");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int hiscore = 0;
for (DataSnapshot ds : dataSnapshot.getChildren()) {
int value = ds.getValue(Integer.class);
if (hiscore < value) {

hiscore = value;

}
Log.d("TAG", String.valueOf(hiscore));
ChangeMe.setText(hiscore);
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}

};
hiscoreRef.addListenerForSingleValueEvent(eventListener);
}

预期结果是屏幕上的 TextView 更改为 Firebase 系统中的最高数字(最高分)

我的数据库的 JSON 树

{
"hiscore" : {
"player_name" : {
"-Lo0W8ks7WCEsrym5Qpl" : {
"name" : "Player 3",
"score" : 24
},
"-Lo0W92WqeUMdq_y7J8M" : {
"name" : "Player 2",
"score" : 42
},
"-Lo0W9KjzXE_XCU4K8MN" : {
"name" : "Player 1",
"score" : 43
}
}
}
}

最佳答案

您可以使用 Firebase 查询来实现此目的。这将使服务器执行检查,而不必在您自己的代码中执行此操作:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference hiscoreRef = rootRef.child("hiscore").child("player_name");
Query hiscoreQuery = hiscoreRef.orderByChild("score").limitToLast(1);
hiscoreQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int hiscore = 0;
for (DataSnapshot ds: dataSnapshot.getChildren()) {
hiscore = ds.child("score").getValue(Integer.class);
}
Log.d("TAG", String.valueOf(hiscore));
ChangeMe.setText(hiscore);
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}

});

您可能会收到有关需要定义索引的警告,在这种情况下,您可以将其添加到您的 Firebase 安全规则中:

"hiscore": {
"player_name": {
".indexOn": "score"
}
}

关于java - 如何找到玩家上传数据中最大的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com