2012-03-11 59 views
2

条款我有一类球员,我从数据库加载:凡在Java中

public class Player{ 

    int id, score; 
    String name; 

    public Player(int id, String name, int score) { 
     this.id = id; 
     this.name = name; 
     this.score = score 
    } 

    public int getID() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 
    public String getScore() { 
     return score; 
    } 
} 

类主要有所有的人都在ArrayList<Player> player

是否有可能通过类似于SQL中的where子句找到该类的特定实例? 我只需要名称,如果我有身份证。
例子:

"SELECT name FROM Player WHERE id = 5"; 
+0

你现在如何查询数据库?如果你改变查询比遍历所有结果更好。 – 2012-03-11 18:14:51

回答

4

没有,但你可以保持您在Players一个HashMap

HashMap<Integer,Player> players; 

,然后用获得所需的Player

Player player = players.get(5); 
+1

SQL将返回一个结果集,每个'Player'的ID是5,你的解决方案只返回一个'Player'。 – Jeffrey 2012-03-11 18:18:14

+2

@Jeffrey id在SQL中通常是唯一的。我试图在上下文中提出这个问题。我敢打赌,ID不会重复。 – 2012-03-11 18:19:26

2

是。其中一种方法是使用Apache Common Collections中的CollectionUtils.filter()。 “where子句”可写在Predicateevaluate()内。

东西喜欢这样的:

CollectionUtils.filter(player, new Predicate() { 
      public boolean evaluate(Object object) { 
       return (((Player) object).getID() == 5) 
      } 
}); 

然后玩家名单将只包含一个ID为5

1

你可以在你的Player的收藏品,每次迭代你遇到一个有玩者目标player.getID() == 5您将其添加到Player的另一个集合中。

EG:

List<Player> players = ... 
List<Player> foundPlayers = new ArrayList<>(); 
for(Player player : players) { 
    if(player.getID() == 5) { 
     foundPlayers.add(player); 
    } 
} 
+1

这似乎非常低效。 – 2012-03-11 18:13:09

+1

真的吗?为什么?你还建议做什么?你的改进解决方案在哪里? – duffymo 2012-03-11 18:14:09

+0

@LuchianGrigore这是如何非常低效?它在'O(n)'中运行,并找到每个ID为5的玩家。 – Jeffrey 2012-03-11 18:14:55

0

你可以只写一个方法基于ID返回一个Player实例,就像如下:

private Player findPlayerById(int id) { 
    for (Player p : player) { 
      if (p.getId() == id) return p; 
    } 
    return null; 
} 
1

写过滤器类,需要一个集合,并返回一个系列:

public interface Filter<K, V> { 
    Collection<V> filter(Collection<K> unfiltered, Map parameters); 
} 

然后你可以做任何你喜欢的事情:

public class ByIdFilter<Person, String> implements Filter<Person, String> { 
    public Collection<String> filter(<Collection<Person> persons, Map parameters) { 
     // particulars here. 

    } 
} 

也许从.NET的LINQ将是一个很好的调查和跟踪模型。

+0

我敢打赌,任何一个对语言不熟悉的人都会这样说,直到他们理解这个成语以及它的工作原理为止。你的偏好是什么?也许Python是给你的。 – duffymo 2014-10-05 13:18:18