【问题标题】:Compare List<String> items to String将 List<String> 项与 String 进行比较
【发布时间】:2012-11-15 11:47:01
【问题描述】:

我正在使用以下代码获取数据库值:

public List<String> getPlayerNames() {
        List<String> playerNames = new ArrayList<String>();
        c = myDataBase.rawQuery("SELECT * FROM PLAYERS",null);
        while (c.moveToNext()) {

            String q = c.getString(1);
            playerNames.add(q);

        }
        c.close();
        myDataBase.close();
        return playerNames;

    }

我现在想用以下方法将此列表中的项目与字符串值进行比较:

private boolean checkIfExists(String newPlayer) {
        // TODO Auto-generated method stub

        List<String> playerNames = myDbHelper.getPlayerNames();
        //here a loop?! 

        return false;
    }

但我真的不知道如何将这些列表项与字符串值进行比较。我尝试使用 for 循环,但又一次,列表不支持 .length() 方法来遍历所有元素?天呐!

【问题讨论】:

  • 如果任何答案对您有用,请将其标记为已接受。

标签: android list compare


【解决方案1】:
for(String playerName : playerNames){
  if(playerName.equals(newPlayer)){
    return true;
  }
}
return false;

【讨论】:

  • 谢谢!这对我有用,我使用了@David M 的提示并使用了 equalsIgnoreCase()。循环的结构确实是逻辑。是不是也可以在数组上使用这种结构,兴趣一样...
  • 一个小问题:假设我想使用这些值,我想我可以用一个while循环来做到这一点?对吗?
  • 您要使用哪些值?
  • 例如,我想使用名称本身将其放入列表视图中...或者使用此 for 循环也可以,但不要使用 if 语句来链接到列表视图?
  • 我实际上认为您应该为此创建另一个问题,这有点离题了。但是,是的,您可以根据需要使用 playerName,问题是 playerName 可能与您已经拥有的 newPlayer 完全相同。
【解决方案2】:
for (String playerName : playerNames) {
   if (playerName.equals(newPlayer)) {
       // do something
   }
}

您可能想要equalsIgnoreCase() 而不是equals()

【讨论】:

  • 如果没有括号,永远不会。
【解决方案3】:

是的,会有一个像下面这样的循环

for(String str : players)
{
    if (str.equalsIgnoreCase(newPlayer))
    { 
      return true; 
    } 
}
return false;

【讨论】:

  • 你应该把返回flase放在foreach之外,否则第一次比较后方法会返回false。
  • 我只是想展示逻辑并写得快:)thanx 进行更正
  • 我试过了,但它似乎无法识别 foreach 循环?那可能吗? :s
  • 如果我没记错的话,foreach 循环是 C# 而 Android 使用 Java,那么 for( tmp : collection) 也是一样的。
  • 不,你是对的,它必须是 FOR 而不是 foreach,正如我之前所说的,因为我想展示逻辑,我没有注意拼写 :) 我在 c# 中进行了测试
【解决方案4】:

为了避免区分大小写的字符串出现问题

for(String playerName : playerNames){
  if(playerName.equalsIgnoreCase(newPlayer)){
    return true;
  }
}

【讨论】:

    【解决方案5】:

    到目前为止,答案很好。这是确保完整性的“另一种方式”解决方案之一。

    您可以考虑使用 Set。

    public Set<String> getPlayerNames() {
        TreeSet<String> playerNames = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
    

    然后使用

    if (playerNames.contains(newPlayer)){}
    

    然后,即使在运行时也可以轻松控制集合的大小写敏感度。

    [编辑]

    也就是说,您的问题可能是“设计一个让我创建、删除和修改播放器的应用程序的正确方法是什么,其详细信息存储在 SQLite 数据库中?”。你没有问这个问题,但我还是会回答这个问题,因为这个问题应该在这个问题之前提出。

    花一些时间在谷歌上搜索“软件设计模式”,尤其是 MVC(模型视图控制器)。 MVC 是许多 Android 应用程序中使用的标准模式。模型是您想要使用的真实世界数据(玩家)。 View(s) 是您的应用程序、ListViews、TextViews 等的接口。控制器(Java 适配器)是将两者绑定在一起并控制如何将数据传递到您的 UI 以及如何对数据进行更改。

    此刻,你有一个大约 3 英寸高的小家伙站在你的左肩上说:“给我看看你有什么。我想尽快看到这个在我的手机上运行。获取它完成并稍后找出错误”。他也很吵闹,难以忽视。

    如果你仔细观察,你会看到另一个小家伙在你的右肩上说:“先把设计做好。然后开始构建应用程序。我不介意等一会儿,因为最终结果会更好”。这个人说话的声音要小得多,而且通常不是很自信。

    你的工作是放火烧左边的人,让他逃跑,然后把 Ben 和 Jerrys 的网络钓鱼冰淇淋喂给右边的人,让他在附近闲逛,给你更多好的建议。

    那么让我们先听听右边那个人的声音:

    “好吧,Matthias,有很多方法可以解决这个问题,但随着您的学习,让我们坚持使用通用方法。这将使 Google 可以轻松找到您需要将其拼接在一起的各个组件。

    您已经有了一个包含 Players 表的数据库,其中包含有关 Players 的数据。让我们在代码中创建一个代表玩家的类。

    public class Player{
          public int id;
          public String name;
          public Boolean likesPhishFood;
    }
    

    现在,当我们启动我们的应用程序时,我们可以将表中的数据加载到我们的应用程序中,以便开始使用它。使用适配器怎么样?然后我们可以使用 Cursor 来查询我们的数据库,我们可以使用它来创建一个适配器,也许是 SimpleCursorAdapter,然后最终将我们的适配器绑定到 ListView。稍后,您可以添加 onClickListener 和 onLongClickListener 以在用户单击列表中的某个 Player 时执行某些操作。

    所有这些的好处是,您的代码毫无疑问最终会导致您在更短的时间内生成应用程序;会更容易阅读;将有更少的错误,也许最重要的是,更容易更改。

    我几乎可以保证,在某个时间点,通常是进行到一半左右,您会想要添加一些关于玩家的数据。也许他们玩过的次数,或者他们有蓝眼睛。使用 MVC 设计,与在代码中寻找 ArrayList 和为适应新数据而需要更改的循环相比,此类更改更容易进行,并且更不容易产生新的错误。

    当然,您的应用需要更多时间才能投入使用,但您在此过程中学到的东西将多次收回投资 - 在此应用和您未来使用的其他应用中。”

    听右边那个人的。他讲道理。

    http://www.mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html

    祝你好运。

    【讨论】:

    • 我必须说,我是菜鸟,这对我来说很难理解:) Set 和 TreeSet 有什么区别?
    • 只是在这种情况下有点挑剔,我认为不应该使用 Set 。 Sets 不允许重复,并且可能会发生两个玩家的名字相同的情况。但实际上 contains() 也应该直接在 List 上工作,因此 contains() 解决方案会更好。
    • 设置为通用接口。 TreeSet 是使用树实现所述接口。
    • List.contains() 使用列表类型的默认比较器,因此对字符串区分大小写。您可以扩展 String 并提供您自己的比较器,但也就是说,如果重复名称是一个问题,那么使用名称作为键是一个坏主意,并且所有使用 ArrayList 的实现都将失败,因为在找到任何匹配项时循环退出。如果这是我,我会做的第一件事是class Player{}
    • 谢谢西蒙!我必须说,确实我创建了一个包含信息的玩家表。当然,考虑到这是我的第一个应用程序,我有一些东西要学习 :) 我从来没有听说过 MVC,我会研究一下.. 我可能会等着在我的下一个应用程序中使用它.. 这个几乎完成了(我知道,它更快:))
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多