2017-01-05 1 views
1

지금 내 첫 번째 Java 게임 코드를 작성하고 있는데 ArrayList에 문제가 있습니다.다른 하나의 요소로 새 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의 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); 

가 그럼 난 쉽게 선수들의 점수를 비교하고 견고한 순위를 만들 수 있습니다처럼 새로운 하나를해야합니다.

+0

이유를 : 마지막으로, 당신은 subList 방법을 사용하여 상위 10 개를 잡아 수 ArrayList를 사용하고 있습니까? 대신 HashMap을 사용하십시오. 키값 쌍 (예 : nickname1 = score1, nickname2 = score2.so)은 it.sorting에 대한 작업을 추가, 삭제하는 것과 같습니다. –

답변

2

내부의 값을 정렬 자신의 비교기를 작성해야합니다. Player 클래스는 컬렉션의 요소의 논리적 순서를 알아내는 자바의 방법입니다 Comparable 인터페이스를 구현해야합니다

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 목록을 정렬하십시오. (이 파일은 각각의 이름에 대한 점수를 가지고 있다고 가정하고 파일의 형식은 위 규정에있을 것입니다)

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); 
} 
+0

'List.subList()'메서드에서 두 번째 매개 변수 인'toIndex'는 배타적입니다. 따라서 상위 10 개를 가지려면'results.subList (0, 10)'그 외 9 개가되어야합니다. – davidxxx

+0

대단히 감사합니다! 그게 내가 찾고 있던거야. 이제 어떻게 그 목록을 JLabel에 표시 할 수 있습니까? 불행히도 수정되지 않았습니다 : JLabel PlayersRanking = new JLabel(); (플레이어 p : top10) { \t \t \t PlayersRanking.setText (String.valueOf (p)); \t} – JeffTheKiller

+0

@JeffTheKiller 스윙에 익숙하지 않습니다. Java에서 수행 한 작업의 99 %는 백엔드 또는 숫자 작업입니다. 이 튜토리얼 https://www.tutorialspoint.com/swing/swing_jlabel.htm을 훑어 보았습니다. 시작하는 장소 인 것처럼 보입니다. 계속 붙잡 힐 경우 다른 질문을 게시 할 수 있습니다. – StaticBeagle

0

당신은 파일에 배열을 저장할 수 있습니다

1 사용 FileInputStram 및 FileOuputStream 작성하고 파일에 배열 객체를 읽을 수 있습니다. 아래와 같이 일반 TEXTFILE로

3 기록을 저장 JSON 같은 부하 어레이

2 사용 GSON 라이브러리 : 플레이어 1
점수는
선수 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

1) Y에 의해 배열을 정렬 할 ArrayList과 관련된 메서드를 사용하지 않기 때문에 Interface (ArrayList 대신 선언 된 형식 인 ArrayList 대신 List)로 프로그래밍해야합니다.

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

2)

은 그 때 나는 새로운 클래스의 타입에있을 것입니다 새로운 ArrayList를을 만들 것입니다. 하지만 내 문제는 정확히 내가 할 수있는 방법을 알 수 없다는 것입니다. 'old'ArrayList의 값을 새로운 ArrayList의 미래형 패러미터와 연결할 수 있습니다.

이렇게하려면 많은 변경 작업이 필요하지 않습니다. 아이디어 (A)는 마지막 두 매핑을 수행하기 때문에 너무 복잡하다 : 당신이 StringList하고 StringList에서 RankingList에 저장 다른 책을 읽어 줄에서 저장 한.
List의지도 읽기 라인을 Ranking으로 지정할 수 있습니다.

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

이제 당신은 이름과 각 선수의 점수를 포함하는 클래스 Player를 만들 수 있습니다 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; 
    } 
}); 
+0

비교에서 r1.score-r2.score;를 반환 할 수 있습니다. –

관련 문제