使用另一个元素创建新的 ArrayList
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 个最佳结果进行排名,我的想法是使 class 具有字段 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
,它将是那个新的 class 的类型。但我的问题是我不完全知道如何将 'old' ArrayList
的值与未来类型的新 ArrayList
的参数连接起来。新的应该是这样的:
static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>();
Ranking rank = new Ranking(nick, score);
然后我可以很容易地比较玩家的分数并做出可靠的排名。
您可以在文件中保存数组:
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()
对数组进行排序
1) 你应该在这里通过接口编程(List
而不是声明类型中的 ArrayList
)因为你不使用特定于 ArrayList
.
的方法
List<Ranking> resultsAfterModification = new ArrayList<Ranking>();
2)
Then I would create a new ArrayList, which would be in the type of
that new class. But my problem is that I don't exactly know how I can
connect values from 'old' ArrayList with the paramaters of future type
of new ArrayList.
要做到这一点,您不需要进行太多更改。
你的想法 a 有点太复杂了,因为最后你执行了两个映射:一个是你从读取行存储到 String
的 List
另一个是你从 List
存储到 String
] 到 Ranking
的 List
.
您可以将地图读取行指向 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));
}
所以你的 Ranking
class 可能看起来像
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;
}
});
您可以创建一个 class Player
,其中包含每位玩家的姓名和得分。 Player
class 应该实现 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
class 后,您可以一次性读取名称和分数,并使用 Collections 实用程序 class 对 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);
}
我现在正在编写我的第一个 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 个最佳结果进行排名,我的想法是使 class 具有字段 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
,它将是那个新的 class 的类型。但我的问题是我不完全知道如何将 'old' ArrayList
的值与未来类型的新 ArrayList
的参数连接起来。新的应该是这样的:
static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>();
Ranking rank = new Ranking(nick, score);
然后我可以很容易地比较玩家的分数并做出可靠的排名。
您可以在文件中保存数组:
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()
对数组进行排序1) 你应该在这里通过接口编程(List
而不是声明类型中的 ArrayList
)因为你不使用特定于 ArrayList
.
List<Ranking> resultsAfterModification = new ArrayList<Ranking>();
2)
Then I would create a new ArrayList, which would be in the type of that new class. But my problem is that I don't exactly know how I can connect values from 'old' ArrayList with the paramaters of future type of new ArrayList.
要做到这一点,您不需要进行太多更改。
你的想法 a 有点太复杂了,因为最后你执行了两个映射:一个是你从读取行存储到 String
的 List
另一个是你从 List
存储到 String
] 到 Ranking
的 List
.
您可以将地图读取行指向 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));
}
所以你的 Ranking
class 可能看起来像
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;
}
});
您可以创建一个 class Player
,其中包含每位玩家的姓名和得分。 Player
class 应该实现 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
class 后,您可以一次性读取名称和分数,并使用 Collections 实用程序 class 对 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);
}