【问题标题】:How to sort an ArrayList of Objects (Player Names and Player Scores)如何对对象的 ArrayList 进行排序(玩家姓名和玩家分数)
【发布时间】:2017-06-13 14:05:16
【问题描述】:

我尝试解决这个问题,但我不知道我做错了什么,已经过了 7 天尝试了很多事情,我需要帮助解决它,我认为错误出在我创建的类上。

我有 4 个玩家,有 4 个文本视图和 4 个其他文本视图用于玩家的得分。此外,我还为 place1、place2、place3、place4 制作了另外 4 个新的文本视图。我想要做的是,我需要对分数进行排序并将它们显示在 place1、place2、place3、place4 以及拥有该分数的玩家的姓名。

到目前为止,我所做的是将我的类创建到 onCreate 部分上方的主要活动中

public class MainActivity extends AppCompatActivity {

    //my created class
    class JucatorScor {

        public String Name;
        public int Scor;

        public JucatorScor (String sName, int iScor) {
            this.Name = sName;
            this.Scor = iScor;
        }
    }

    //begin oncreate
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //end oncreate
}

我还有一个按钮,当我点击它时,从文本视图中读取我的值,查看球员姓名、球员得分,然后对数组进行排序后显示 place1、place2、place3、place4,如下所示:

//begin button click
public void sorteazaCLICK (View view) {

    //initialization place1, place2, place3, place4 where i will put the sorting value
    TextView varPozitia1 = (TextView) findViewById(R.id.text_loc1);
    TextView varPozitia2 = (TextView) findViewById(R.id.text_loc2);
    TextView varPozitia3 = (TextView) findViewById(R.id.text_loc3);
    TextView varPozitia4 = (TextView) findViewById(R.id.text_loc4);

    //initialization name of players
    TextView varNumeJucator1 = (TextView) findViewById(R.id.text_numeJuc1);
    String sNameJuc1;
    sNameJuc1 = varNumeJucator1.getText().toString();

    TextView varNumeJucator2 = (TextView) findViewById(R.id.text_numeJuc2);
    String sNameJuc2;
    sNameJuc2 = varNumeJucator1.getText().toString();

    TextView varNumeJucator3 = (TextView) findViewById(R.id.text_numeJuc3);
    String sNameJuc3;
    sNameJuc3 = varNumeJucator1.getText().toString();

    TextView varNumeJucator4 = (TextView) findViewById(R.id.text_numeJuc4);
    String sNameJuc4;
    sNameJuc4 = varNumeJucator1.getText().toString();

    //initialization scores
    TextView varScorJucator1 = (TextView) findViewById(R.id.text_scorJuc1);
    String t1;
    t1 = varScorJucator1.getText().toString();

    TextView varScorJucator2 = (TextView) findViewById(R.id.text_scorJuc2);
    String t2;
    t2 = varScorJucator2.getText().toString();

    TextView varScorJucator3 = (TextView) findViewById(R.id.text_scorJuc3);
    String t3;
    t3 = varScorJucator1.getText().toString();

    TextView varScorJucator4 = (TextView) findViewById(R.id.text_scorJuc4);
    String t4;
    t4 = varScorJucator1.getText().toString();


    //transform the values from text view scores into integer
    int iScorJuc1;
    iScorJuc1 = Integer.parseInt(t1);

    int iScorJuc2;
    iScorJuc2 = Integer.parseInt(t2);

    int iScorJuc3;
    iScorJuc3 = Integer.parseInt(t3);

    int iScorJuc4;
    iScorJuc4 = Integer.parseInt(t4);


    ArrayList<JucatorScor> arrJucatorScor = new ArrayList<>(4);


        //building manually the array list
        arrJucatorScor.add(new JucatorScor(sNameJuc1, iScorJuc1));  //position 0
        arrJucatorScor.add(new JucatorScor(sNameJuc2, iScorJuc2));  //position 1
        arrJucatorScor.add(new JucatorScor(sNameJuc3, iScorJuc3));  //position 2
        arrJucatorScor.add(new JucatorScor(sNameJuc4, iScorJuc4));  //position 3

    Collections.sort(arrJucatorScor, new Comparator<JucatorScor>() {

        //sorting my object array depending on scores
        @Override
        public int compare(JucatorScor o1, JucatorScor o2) {
            return Integer.valueOf(o1.Scor).compareTo(o2.Scor);
        }

    });


    //here display them from bigger to smaller according to eatch place1, place2, place3, place4
    varPozitia1.setText(String.valueOf(arrJucatorScor.get(3)));
    varPozitia2.setText(String.valueOf(arrJucatorScor.get(2)));
    varPozitia3.setText(String.valueOf(arrJucatorScor.get(1)));
    varPozitia4.setText(String.valueOf(arrJucatorScor.get(0)));

} //end button click

问题是,当我点击按钮时,不要把 place1、place2、place3、place4 的名称和分数排序...只是出现在这张照片中的一些东西:

【问题讨论】:

    标签: java android arrays sorting


    【解决方案1】:

    这里你使用JucatorScortoString()方法来渲染对象:

    varPozitia1.setText(String.valueOf(arrJucatorScor.get(3)));
    varPozitia2.setText(String.valueOf(arrJucatorScor.get(2)));
    varPozitia3.setText(String.valueOf(arrJucatorScor.get(1)));
    varPozitia4.setText(String.valueOf(arrJucatorScor.get(0)));
    

    您在屏幕上看到的是基类提供的默认实现toString()

    你要么用想要的文本实现toString()

    或者另一种解决方案是在辅助方法中执行渲染,并在TextView 中设置合适的String

    public set renderTopJucatorScor(JucatorScor jucatorScor, int ranking, TextView varPozitia){    
        varPozitia.setText("Loc" + ranking +  " = " + jucatorScor.getName() + jucatorScor.getScore());
    }
    

    然后你可以像这样调用辅助方法:

    renderTopJucatorScor(varPozitia1, arrJucatorScor.get(3), 1);
    renderTopJucatorScor(varPozitia2, arrJucatorScor.get(2), 2);
    renderTopJucatorScor(varPozitia3, arrJucatorScor.get(1), 3);
    renderTopJucatorScor(varPozitia4, arrJucatorScor.get(0), 4);
    

    【讨论】:

    • 非常感谢您的回答...但是...我不明白..您可以用代码举例吗?我试着把这个放在我的课上 @Override public String toString() { return Name + " " + Scor; } 但没有正确显示结果:((
    • 不客气。如果在 JucatorScor 类中添加 toString() 方法,它应该可以工作。您是否注意到渲染的任何变化?如果你什么也没看到,可能编译的代码没有更新。
    • 我创建的类现在看起来像这样 class JucatorScor { public String Name;公共 int 得分;公共 JucatorScor (String sName, int iScor) { this.Name = sName; this.Scor = iScor; } @Override public String toString() { return Name + " " + Scor;这是我只在课堂上所做的所有更改,当我运行应用程序时。显示结果如下所示 Place1 = Aladin 550 Place2 = Aladin 120 Place3 = Aladin 120 Place4 = Aladin 120
    • 你在初始代码中想要获取第三个和第四个textView的分数时出现了不注意的错误。您仍然使用 varScorJucator1 代替 varScorJucator3 和 varScorJucator4:TextView varScorJucator3 = (TextView) findViewById(R.id.text_scorJuc3); String t3; t3 = varScorJucator1.getText().toString(); TextView varScorJucator4 = (TextView) findViewById(R.id.text_scorJuc4); String t4; t4 = varScorJucator1.getText().toString();T
    • 结局很开心 :) 为避免此类问题,您应该像我在回答中所做的那样支持使用辅助方法,而不是进行简单但也会带来风险的复制/粘贴重用坏变量。例如,获取每个 textview 分数的三个指令可以在返回 String 的辅助方法中。
    【解决方案2】:

    在发现(在用户“davidxxx”的帮助下)我的 textviews 初始化中出现了一些错误,最终我设法解决了这个问题。我还在我创建的类中添加了一个方法:toString。

    正确的解决办法是这样的:

    //my created class
    class JucatorScor {
    
        public String Name;
        public int Scor;
    
        public JucatorScor (String sName, int iScor) {
            this.Name = sName;
            this.Scor = iScor;
        }
    //this is the toString added to diplay name and score 
        @Override
        public String toString() {
            return Name + " " + Scor;
        }
    
    }
    

    以及按钮点击的执行代码

    //begin button click
    public void sorteazaCLICK(View view) {
    
        //initialization of textvies for place1 to place 4
        TextView varPozitia1 = (TextView) findViewById(R.id.text_loc1);
        TextView varPozitia2 = (TextView) findViewById(R.id.text_loc2);
        TextView varPozitia3 = (TextView) findViewById(R.id.text_loc3);
        TextView varPozitia4 = (TextView) findViewById(R.id.text_loc4);
    
        //initialization for name of players
        TextView varNumeJucator1 = (TextView) findViewById(R.id.text_numeJuc1);
        String sNameJuc1;
        sNameJuc1 = varNumeJucator1.getText().toString();
    
        TextView varNumeJucator2 = (TextView) findViewById(R.id.text_numeJuc2);
        String sNameJuc2;
        sNameJuc2 = varNumeJucator2.getText().toString();
    
        TextView varNumeJucator3 = (TextView) findViewById(R.id.text_numeJuc3);
        String sNameJuc3;
        sNameJuc3 = varNumeJucator3.getText().toString();
    
        TextView varNumeJucator4 = (TextView) findViewById(R.id.text_numeJuc4);
        String sNameJuc4;
        sNameJuc4 = varNumeJucator4.getText().toString();
    
        //initialization of scores
        TextView varScorJucator1 = (TextView) findViewById(R.id.text_scorJuc1);
        String t1;
        t1 = varScorJucator1.getText().toString();
    
        TextView varScorJucator2 = (TextView) findViewById(R.id.text_scorJuc2);
        String t2;
        t2 = varScorJucator2.getText().toString();
    
        TextView varScorJucator3 = (TextView) findViewById(R.id.text_scorJuc3);
        String t3;
        t3 = varScorJucator3.getText().toString();
    
        TextView varScorJucator4 = (TextView) findViewById(R.id.text_scorJuc4);
        String t4;
        t4 = varScorJucator4.getText().toString();
    
    
        //transformation scores into integer values
        int iScorJuc1;
        iScorJuc1 = Integer.parseInt(t1);
    
        int iScorJuc2;
        iScorJuc2 = Integer.parseInt(t2);
    
        int iScorJuc3;
        iScorJuc3 = Integer.parseInt(t3);
    
        int iScorJuc4;
        iScorJuc4 = Integer.parseInt(t4);
    
    
        ArrayList<JucatorScor> arrJucatorScor = new ArrayList<>(4);
    
    
        //manually construct of the object array list
        arrJucatorScor.add(new JucatorScor(sNameJuc1, iScorJuc1));  //position 0
        arrJucatorScor.add(new JucatorScor(sNameJuc2, iScorJuc2));  //position 1
        arrJucatorScor.add(new JucatorScor(sNameJuc3, iScorJuc3));  //position 2
        arrJucatorScor.add(new JucatorScor(sNameJuc4, iScorJuc4));  //position 3
    
        Collections.sort(arrJucatorScor, new Comparator<JucatorScor>() {
    
            //the sort of the object list by their scores
            @Override
            public int compare(JucatorScor o1, JucatorScor o2) {
                return Integer.valueOf(o1.Scor).compareTo(o2.Scor);
            }
    
        });
    
    
        //here are displayed in the position place1 to place4 from bigger score to smaller score
        varPozitia1.setText(String.valueOf(arrJucatorScor.get(3)));
        varPozitia2.setText(String.valueOf(arrJucatorScor.get(2)));
        varPozitia3.setText(String.valueOf(arrJucatorScor.get(1)));
        varPozitia4.setText(String.valueOf(arrJucatorScor.get(0)));
    
    
    }//end button click
    

    非常感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2017-06-07
      • 2020-12-19
      • 1970-01-01
      • 2015-11-20
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多