views:

117

answers:

2

I'm having issues formatting an input String into an ArrayList. I commented out some of the things I've tried. Initially I tried to put the input into a string then add to arrayList.

The input is one long string:

(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*

What I have so far:

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();
 }
}
+1  A: 

Use this as a pseudo code.

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])));
    }

}
chedine
Thank you so much I owe you a beer.
Joshua
:-) Glad that it helped. Please accept the answer if it answers the question completely.
chedine
+1  A: 

You can also do it using a regex and 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);
    }
}
dogbane