【问题标题】:Adding user input to a map and incrementing integer key by 1将用户输入添加到地图并将整数键增加 1
【发布时间】:2015-04-17 08:11:07
【问题描述】:

Java 新手,刚开始做地图,尝试了几天但成功有限,(代码中的 cmets)欢迎所有建议。理想情况下,我想从一个未填充的地图开始,纯粹用用户输入 playerName 填充它,并在输入每个名称时将整数值加一。希望这符合所有准则!

/**
 * Constructor for objects of class player Creates player
 * objects and tests for unique player name
 */
public player() {
    Map<String, Integer> playerMap = new HashMap<>();
    System.out.println("Players in game: " + playerMap.isEmpty());
    playerMap.put("Fred", 1);
    playerMap.put("Bob", 2);
    playerMap.put("Alice", 3);
    playerMap.put("Charlotte", 4);
    playerMap.put("Catherine", 5);
    System.out.println("Players in game: " + playerMap.size());

    /**
     * user input via dialogue to get another playerName String
     * playerName set to Catherine for testing
     */
    String playerName = "Catherine";
    boolean existing = playerMap.containsValue(playerName);
    System.out.println(existing);
    if (existing = true) {
        int playerNumber = 5;
        /**
         * user input via dialogue to get another playerName I need
         * to set playerNumber = highest existing key in map then
         * increment by one then add values to map loop until all
         * players have been entered, I am considering while
         * (playerName != "last"); playerNumber set to 5 for
         * testing
         */
        playerNumber = playerNumber++;
        playerMap.put(playerName, playerNumber);
    }
}

【问题讨论】:

  • if (existing = true) 这是错误的。这不是您将变量与布尔值进行比较的方式。
  • 那么究竟是什么问题?

标签: java string dictionary user-input


【解决方案1】:

containsValue 方法检查映射中是否已存在值。

“凯瑟琳”不是一个值。这是一把钥匙。

请改用containsKey

或者你可能有反转的键和值。所以创建一个Map&lt;Integer, String&gt; 并在上面加上值。

【讨论】:

    【解决方案2】:

    你可以 iterate 代替 containsValue ,因为 containsValue 在内部遍历整个地图。

    private boolean exists(String playerName){
       boolean isExists=false;
       for(Map.Entry<String, Integer> playerEntry:playerMap.entry()){
         if(playerEntry.getValue().equals(playerName){
           isExists=true;
           break;
         }
       }
       return isExists;
     }
    

    它是 50-50,如果map 不包含它将遍历整个地图的值。如果它包含该值,它将中断循环并返回true

    然后您可以使用以下逻辑将put 转换为playerMap

    private void addToMap(String playerName){
     if(playerName!=null && exists(playerName)){
       playerMap.put(playerName, ++playerNumber);
     }
    }
    

    【讨论】:

      【解决方案3】:

      您的 if 语句(existing = true)是错误的,因为单个“=”是赋值而不是比较。如果要比较两个布尔值是否相等,请使用双等号“==”进行比较。实际上,您甚至不需要检查“现有”变量是否为真,因为它已经是一个布尔值,只需用 if 语句包围变量,如果为真,它将进​​入 if 块,否则不会.当前,您的代码将始终输入 if 代码块,因为您将“现有”变量分配为 true。

      正如之前的海报所提到的,您将名称用作键而不是值,因此您应该使用 containsKey() 方法而不是 containsValue()。

      如果您的地图包含键“Catherine”,则以下代码仅应输入 if 块

        String playerName = "Catherine";
        boolean existing = playerMap.containsKey(playerName);
        if (existing) {
          int playerNumber = 5;
          /**
           * user input via dialogue to get another playerName I need
           * to set playerNumber = highest existing key in map then
           * increment by one then add values to map loop until all
           * players have been entered, I am considering while
           * (playerName != "last"); playerNumber set to 5 for
           * testing
           */
          playerNumber = playerNumber++;
          playerMap.put(playerName, playerNumber);
      }
      

      【讨论】:

      • 非常感谢大家的帮助...过去几天的工作,明天将能够重新开始。只是处理所有的新信息!是的,我确实希望值是名称,键是数字。那么 map 中的第一个字段是键,第二个字段是值?如: Map ?傻我。
      【解决方案4】:

      这段代码似乎已经成功了,并且列出了所有输入的玩家姓名,感谢所有帮助,只是想发布决赛,欢迎任何其他cmets!非常喜欢java....

       public player()
       {
        Map<Integer, String> playerMap = new HashMap<>();
        int playerNumber = 0;
      
       do
       {
        String playerName = 'user input request dialogue box' ("Please input a unique player name (5 Maximum): " + ((playerMap.size() - 10) * -1) + " Player slots left.");  
        boolean existing = playerMap.containsValue(playerName);                         
        System.out.println(existing);
        if (existing == false)
        {
          playerNumber = ++playerNumber;
          playerMap.put(playerNumber, playerName);
          System.out.println("Number of players in game: " + playerMap.size());
      
        }
      } 
      while (playerNumber < 5);
      
      
      System.out.println("Players in game are:");
      for (int a : playerMap.keySet())
      {
      
        System.out.println("Player " + a + " is \"" + playerMap.get(a) + "\"" );
      
      
      
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多