Сортировать связанный текстовый файл в Java, создав общий индекс - PullRequest
0 голосов
/ 14 марта 2011

Привет всем, я хочу отсортировать 2 связанных файла, создав уникальный индекс, который может отсортировать оба из них

У меня есть файл .txt, отформатированный как следующий пример:

File1

Houston
Chicago
Seattle
Cleveland

Другой файл отформатирован так:

File2

44
33
55
22

Я хочу следующий вывод:

Seattle 55
Houston 44
Chicago 33
Cleveland 22

Я создал 2 массива объектов из файлов .txt, поэтому я могу 't использовать пузырьковую сортировку из-за оператора <или>.Я использовал функцию .sort для сортировки результатов, но таким образом я не создаю индекс для сортировки команд.Как мне решить проблему?

Это мой код

 private void visualizzaClassificaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                           
    // TODO add your handling code here:
    List<String> teams = new ArrayList<String>();
    List<Float> scores = new ArrayList<Float>();

    try {
        FileInputStream fstream = new FileInputStream("C:/Users/Fra....../file1");
        FileInputStream fstream2 = new FileInputStream("C:/Users/Fra...../file2");
        DataInputStream in = new DataInputStream(fstream);
        DataInputStream in2 = new DataInputStream(fstream2);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
        String team = null;
        String score = null;

        while ((score = br.readLine()) != null && (team = br2.readLine()) !=null)   {
            teams.add(team);
            scores.add(Float.parseFloat(score));
        }

        Object[] squadreTutte = teams.toArray();
        Object[] punteggiTutti = scores.toArray();
        Arrays.sort(punteggiTutti, Collections.reverseOrder());
        //????????????????????????????????
        for(int index=0; index<punteggiTutti.length; index++){
            System.out.println(punteggiTutti[index]);
            System.out.println(squadreTutte[index]);
        }
        in.close();
    } catch (Exception e) {
    }

}

Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Почти всегда, когда кто-то хочет отсортировать параллельные массивы, это случай отказа объекта .

Что вам нужно сделать, это создать объект для хранения имени, пары очков:

public class Team implements Comparable<Team> {
  private final String name;
  private final int score;

  public Team(final String name, final int score) {
    this.name=name;
    this.score=score;
  }

  // add getters

  public int compareTo(Team other) {
    if (this.score != other.score) {
      return Integer.valueOf(this.score).compareTo(other.score);
    } else {
      return this.name.compareTo(other.name);
    }
  }
}

Затем при чтении файлов создайте объект Team для каждой строки в файлах, поместите их в Collection и отсортируйте их. Вам нужно либо внедрить Comparable в своем классе (как я делал выше), либо предоставить Comparator для их сортировки.

1 голос
/ 14 марта 2011

Гораздо проще отсортировать команду и набрать очки в натруале, и прочитать сборник в обратном порядке.Кстати, не используйте float или Float, если нет веских причин для этого.Вместо этого используйте Long или Double.

На основе класса команды @ Joachim's

List<Team> teams = new ArrayList<Team>();

BufferedReader br=new BufferedReader(new FileReader("C:/Users/Fra..../file1"));
BufferedReader br2=new BufferedReader(new FileReader("C:/Users/Fra..../file2"));

String name = null;
String score = null;
while ((score = br.readLine()) != null && (name = br2.readLine()) != null) 
    teams.add(new Team(name, Double.parseDouble(score)));
br.close();
br2.close();

// reverse sort.
Collections.sort(teams, new Comparator<Team>() {
    public int compare(Team t1, Team t2) {
        return Double.compare(t2.score, t1.score);
    }
});


for(Team t: teams)
   System.out.println(t.name + ' ' + t.score);


public class Team {
  final String name;
  final double score;

  public Team(String name, double score) {
    this.name=name;
    this.score=score;
  }
}
0 голосов
/ 14 марта 2011

Цель состоит в том, чтобы команды в первом списке были отсортированы по количеству очков из второго списка?

Ваша проблема в том, что сортировка обоих списков не связана. Вместо этого вы должны попытаться отсортировать пары "команда + оценка". Может быть, использование что-то вроде List<Entry<Double, String>> может сделать то, что вы хотите, определив пользовательский компаратор ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...