使用逻辑读取具有多个列的文本文件

时间:2012-10-06 23:25:14

标签: java algorithm

我正在阅读一个包含多列的文本文件,我将这些信息存储在一个数组中

文件看起来像这样

Player   |   Team
---------| ---------
PlayerA  |  Team1
PlayerA  |  Team2
PlayerB  |  Team3
PlayerC  |  Team4
PlayerC  |  Team5

如你所见,每个玩家都有多个团队。我试图逐行读取这个文件,以便在文件的末尾我有一个包含三个玩家(A,B和C)的列表,每个玩家都有相应的团队。

类:

Player - with Name and List<Team> (getter setter for both)
Team   - with Name (getter and setter)

我无法弄清楚何时创建Player和Team类以及在玩家名称更改时保留帐户的逻辑

2 个答案:

答案 0 :(得分:0)

您可以将personteam封装在两个类PersonTeam中。

然后,您可以使用Map<Person, List<Team>>为每个人维护各种团队..

Map<Person, List<Team>> mapping = new HashMap<>();

// Read each line from file..

// Get Person and Team object..

// Assuming that you have your `Person` object in person and `Team` object in team

// You need a Comparator for `Person` class to check for `containment`..
if (mapping.contains(person)) {

    // Person already exist.. Update the list of Team he has
    mapping.get(person).add(team);

} else {

    // New entry.. create a new list.. and add it to map..
    List<Team> teamList = new ArrayList<>();
    teamList.add(team);
    mapping.put(person, teamList);
}

注意: - 您的Comparator课程需要Person才能进行比较..

我想我已经为你提供了一个工作基础..休息你需要解决方法..如何填充你的对象..如何实现Comparator ..以及所有......

答案 1 :(得分:0)

通常情况下,我不会质疑所提出的模型的有效性,但......对于那些拥有众多球员而非相反球队的球队来说,更有意义吗?

无论如何,假设球队的名字不能被一支以不同球员名称再次出现的球队改变:

  BufferedReader input = ...;
  Map<String,Player> playersByName = new HashMap<String,Player>();

  String line;
  while ((line = input.readLine()) != null) {
     String playerName;
     String teamName;
     // code to parse the player and team names from 'line' comes here.

     Player player = playersByName.get(playerName);
     if (player == null)
       playersByName.put(playerName,player = new Player(playerName));

     Team team = new Team(teamName);
     if (!player.getTeams().contains(team)) 
        player.getTeams().add(team);
  }

代码假定Player构造函数创建一个空的团队列表。

虽然上面的内容可以使用一个列表来支持玩家的团队,但我建议你使用Set代替效率,如果玩家拥有的团队数量可能很大。在这种情况下,您不需要最后一个条件,您可以直接添加。

如果你完全隐藏ListSet实现并添加操作以在Player类中安全地操作团队列表,那就更好了。

请记住,如果您使用(哈希)Set解决方案(隐藏或公开),则需要在equals中适当地覆盖hashCodeTeam个功能class(在名称上委托它们会很好用)。