[英]creating new ArrayList with elements from another one
我正在写我的第一个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
...
我想对10个最佳结果进行排名,我的想法是使该类的字段带有nick和score,并以某种方式将该字段分配给ArrayList中的相应字段。 也许我可以这样:(?)
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
值与将来的new ArrayList
类型的参数连接起来。 新的应该是这样的:
static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>();
Ranking rank = new Ranking(nick, score);
然后,我可以轻松比较球员的得分并取得稳定的排名。
您可以创建一个包含每个玩家姓名和得分的Player
类别。 Player
类应实现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)因为不使用特定于ArrayList
方法,所以应在此处通过Interface(在声明的类型中使用List
而不是ArrayList
)进行编程。
List<Ranking> resultsAfterModification = new ArrayList<Ranking>();
2)
然后,我将创建一个新的ArrayList,它就是该新类的类型。 但是我的问题是我不完全知道如何将“旧” ArrayList的值与将来的新ArrayList类型的参数连接起来。
为此,您不需要太多更改。 一个你来自哪里读线存储:因为最后执行两个映射你的想法是有点太复杂List
的String
和另一个你来自哪里,存储List
的String
来List
的Ranking
。
您可以将地图阅读行定向到Ranking
List
。
List<Ranking> rankings = new ArrayList<Ranking>();
BufferedReader br = new BufferedReader(new FileReader(ranking));
String nick = null;
while ( (nick = br.readLine()) != null){
String score = br.readLine();
rankings.add(new Ranking(nick, score));
}
您可以将数组保存在file中:
1使用时,FileInputStram和FileOuputStream可以将数组对象写入和读取到文件。
2使用Gson库将数组保存和加载为json
3编写为普通文本文件,如下所示:Player 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()对数组进行排序
因此,您的Ranking
课程可能看起来像
public class Ranking {
public String nick;
public int score;
}
我认为nick
和score
是分别包含缺口和分数的两个ArrayList
。
因此,要创建一个通用的ArrayList
,如果nick
和score
的大小相同,则可以执行以下操作。
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;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.