使用另一个元素创建新的ArrayList

时间:2017-01-05 03:59:43

标签: java arraylist ranking

我正在编写我的第一个Java游戏的代码,我遇到ArrayList的问题。我有一个,具有昵称和分数等元素,具体我从文本文件(下面的代码)创建它:

static ArrayList<String> results = new ArrayList<String>();
BufferedReader br = new BufferedReader(new FileReader(ranking));
        String line = br.readLine();
        results.add(line);

while(line != null) {
    line = br.readLine();
    results.add(line);
}

br.close();

所以文件看起来像这样:

nick1
score1
nick2
score2
...

我想排名前十名最佳成绩,我的想法是让这个类具有字段缺口和分数,并以某种方式将这些字段分配给ArrayList中的appriopriate。也许我可以这样做:(?)

for(int i = 0;i<results.size();i=i+2){
    nick = results.get(i);
}

for(int i = 1;i<results.size();i=i+2){
    score = results.get(i);
}

然后我会创建一个新的ArrayList,它将是新类的类型。但我的问题是,我并不完全知道如何将“旧”ArrayList的值与未来类型的新ArrayList的参数连接起来。新的应该是:

static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>();
Ranking rank = new Ranking(nick, score);

然后我可以轻松比较球员的得分并进行稳定的排名。

4 个答案:

答案 0 :(得分:3)

您可以创建一个包含每个玩家名称和分数的班级PlayerPlayer类应该实现Comparable接口,这是Java计算集合中元素的逻辑顺序的方式:

public class Player implements Comparable<Player>
{
    private String _name;
    private double _score;

    public Player(String name, double score)
    {
        this._name = name;
        this._score = score;
    }

    public String getName()
    {
        return this._name;
    }

    public double getScore()
    {
        return this._score;
    }

    // Since you probably want to sort the players in
    // descending order, I'm comparing otherScore to this._score.
    @Override
    public int compareTo(Player otherScore) 
    {
        return Double.compare(otherScore._score, this._score);
    }

    @Override
    public String toString()
    {
        return "Name: " + this._name + ", Score: " + Double.toString(this._score);
    }
}

创建Player类后,您可以一次性读取名称和分数,并使用Collections实用程序类对Player列表进行排序。最后但并非最不重要的是,您可以使用subList方法获取前十名:(这假定文件将为每个名称分数,文件将采用您在上面指定的格式)

public static void main(String[] args)
{
    List<Player> results = new ArrayList<Player>();
    BufferedReader br;
    try 
    {
        br = new BufferedReader(new FileReader("myFile.txt"));
        String line = br.readLine();
        while(line != null)
        {
            String name = line;
            double score = Double.parseDouble(br.readLine());
            results.add(new Player(name, score));
            line = br.readLine();
        }
        br.close();
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    // Sort using the java.util.Collections utility class
    // Sorting will modify your original list so make a copy
    // if you need to keep it as is.
    Collections.sort(results);
    // Top 10
    List<Player> top10 = results.subList(0, 10);
}

答案 1 :(得分:1)

1)您应该通过接口(List而不是声明类型中的ArrayList)进行编程,因为您不使用特定于ArrayList的方法。

List<Ranking> resultsAfterModification = new ArrayList<Ranking>();

2)

  

然后我会创建一个新的ArrayList,它的类型为   新课程。但我的问题是我不知道我怎么做   将'old'ArrayList中的值与未来类型的参数连接起来   新的ArrayList。

要做到这一点,您不需要做太多更改。 你的想法有点过于复杂,因为最后你会执行两个映射:一个是从读取行存储到List String的另一个映射,另一个是List String存储的映射} List的{​​{1}} 您可以将地图阅读行指向Ranking的{​​{1}}。

List

答案 2 :(得分:0)

您可以将数组保存在文件中:

1使用FileInputStram和FileOuputStream来编写和读取数组对象到文件。

2使用Gson库保存并加载数组为json

3写为普通文本文件,如下所示: 球员1
分数1 球员2
分数2 ....

ArrayList<Player> list=new ArrayList();
Scanner sc=new Scanner(new File("filepath.txt"));
While(sc.hasNextLine()){
  Player p=new Player();
  p.name=sc.nextLine();
  If(sc.hasNextFloat()){
     p.score=sc.nextFloat();
     list.add(p);
  }
}
Arrays.sort(list,...);

可以通过Arrays.sort()

对数组进行排序

答案 3 :(得分:0)

所以你的Ranking类看起来像

public class Ranking {
    public String nick;
    public int score;
}

我认为nickscore分别是包含刻痕和分数的两个ArrayList

因此,要创建一个公共ArrayList,如果nickscore的大小相同,您可能会执行此类操作。

static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>();
for(int i = 0; i < nick.size(); i++) {
    Ranking rank = new Ranking(nick.get(i), score.get(i));
    resultsAfterModification.add(rank);
}

现在您需要编写自己的比较器来对resultsAfterModification

中的值进行排序
Collections.sort(resultsAfterModification, new Comparator<Ranking>() {
    @Override
    public int compare(Ranking r1, Ranking r2) {
        if (r1.score > r2.score)
            return 1;
        if (r1.score < r2.score)
            return -1;
        return 0;
    }
});