我在将输入String格式化为ArrayList时遇到问题。我评论了一些我尝试过的东西。最初我尝试将输入放入字符串然后添加到arrayList。
输入是一个长字符串:
(A,Name1,200), (A,Name1,200), (R,Name1,200), (A,Name2,900), (A,Name2,500), (A,Name3,800), (A,Name4,150), (A,Name5,850), (A,Name6,750), (A,Name7,950), (A,Name8,250), (R,Name6,750), (A,Name10,450), (A,Name11,1000)*emphasized text*
到目前为止我所拥有的:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
*
* @author Joshua
*/
public class HighScore {
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
/**
Scanner sc = new Scanner(System.in);
String scores = sc.nextLine();
scores = scores.replace('(', '"');
scores = scores.replace('(', '"');
StringBuffer str = new StringBuffer(scores);
for (int i = 0; i < scores.length(); i++)
{
if (scores.charAt(i) == ',')
{
str.insert(i, 'H');
}
}
System.out.println(str);
*/
ArrayList<Score> list = new ArrayList<Score>();
ArrayList <Score> topscore = new ArrayList<Score>();
/**
list.add (new Score("A","1111",99999));
list.add (new Score("A","2222",88888));
list.add (new Score("A","3333",77777));
list.add (new Score("A","4444",66666));
list.add (new Score("A","5555",55555));
list.add (new Score("A","6666",44444));
list.add (new Score("R","4444",66666));
list.add (new Score("A","7777",22222));
list.add (new Score("A","8888",11111));
*/
Collections.sort(list);
//For loop to add all the high scores with 'A' as the command to the ArrayList topscore
for(Score addScore : list)
{
if (addScore.getCommand().equalsIgnoreCase("A"))
topscore.add(addScore);
}
//For loop to remove all the high scores with 'R' as the command from the ArrayList topscore
for(Score remScore : list)
{
if (remScore.getCommand().equalsIgnoreCase("R"))
for (int i = 0; i < topscore.size(); i++)
{
if (remScore.getName().equals(topscore.get(i).getName()))
if(remScore.getScoreValue() == topscore.get(i).getScoreValue())
topscore.remove(i);
}
}
//Prints the finished finalScore list
for(Score finalScore : topscore)
{
System.out.println(finalScore);
}
/**
String s[]=new String[100];
for(int i=0;i<s.length;i++)
{
s = scores.substring(1, scores.length()-1).split("\\), \\(");
}
*/
sc.close();
}
}
答案 0 :(得分:2)
你也可以使用正则表达式和capturing groups:
来完成public static void main(String[] args) {
String input = "(A,Name1,200), (A,Name1,200), (R,Name1,200), (A,Name2,900), (A,Name2,500)";
Pattern p = Pattern.compile("\\(([A,R]?),(\\w+?),(\\d+?)\\)");
Matcher m = p.matcher(input);
ArrayList<Score> scores = new ArrayList<Score>();
ArrayList<Score> topScores = new ArrayList<Score>();
while (m.find()) {
String action = m.group(1);
String name = m.group(2);
double scoreVal = Double.valueOf(m.group(3));
Score score = new Score(name, scoreVal);
scores.add(score);
if ("A".equalsIgnoreCase(action)) {
topScores.add(score);
} else { // remove
for (Score topScore : topScores) {
// make sure you have implemented equals() in the Score class
if (topScore.equals(score)) {
topScores.remove(score);
}
}
}
}
// Prints the finished finalScore list
for (Score finalScore : topScores) {
System.out.println(finalScore);
}
}
答案 1 :(得分:1)
将此作为伪代码使用。
public static void main(String[] args) {
String input = "(A,Name1,200), (A,Name1,200), (R,Name1,200), (A,Name2,900), (A,Name2,500)";
String[] scoreSets = input.split("\\),");
List<Score> scoreList = new ArrayList<Score>();
for (String score : scoreSets) {
score = score.trim().substring(1);
int closeBrace = score.indexOf(')');
if (closeBrace == score.length() - 1) {
score = score.substring(0, score.length() - 1);
}
String[] tokens = score.split(",");
scoreList.add(new Score(tokens[0],tokens[1],Double.valueOf(tokens[2])));
}
}