【问题标题】:Replacing Keys in maps ,替换地图中的键,
【发布时间】:2015-01-20 21:08:56
【问题描述】:

我已经制作了一个程序来制作一张新地图并从用户那里获取输入并填充地图......

然后我反转了地图键/值并用它制作了一个新地图......

我唯一坚持的事情,这是困难的部分......是检查“值”中是否有重复项,如果是这样......我只想保留与较小值相对应的 1它的关键... 例如,如果我有 12=13 、 8=13 ,我想将 8=13 放在我的第二个倒置映射中并删除 12=13。

public class
{
public static void main(String[] args)
{
    PrintStream output = new PrintStream(System.out);
    Scanner input = new Scanner(System.in);


    Map<String,String> normal = new HashMap<String,String>();

    output.println("Enter your map, one key-value pair per line,");
    output.println("comma-separated. Use empty line as sentinel.");

    for ( String entry = input.nextLine(); entry.length() !=0;
        entry = input.nextLine())
    {
    int comma = entry.indexOf(",");
    String key = entry.substring(0,comma);
    String value = entry.substring(comma+1);
    normal.put(key,value);

    }
    output.println(normal);

    Map<String,String> reverse = new HashMap<String,String>();

    for (Map.Entry<String,String> entry : normal.entrySet())
    {

        String keyY = entry.getKey();
        String valueE = entry.getValue();
        reverse.put(valueE,keyY);



    }
    output.println(reverse);

}
 }

【问题讨论】:

  • 不是很清楚你想要什么,也许给一个代码示例?
  • 在第二个 Map 中输入键/值之前,检查键是否已经存在?
  • 抱歉,这里是代码..
  • 我有点困惑——你想在键较小的地方保留键值条目,就好像它是一个数字一样。但是,您使用的是 Map,而不是使用 Map。如果您的地图存储字符串,则无法保证您的键可以转换为数字。如果不是 "8"="13" 和 "12"="13" 而是 "hello"="13" 和 "hi"="13" 怎么办?你想保留哪一个?或者你的意思是使用数字映射而不是字符串映射?
  • @TJamesBoone 老实说,我应该使用 Map 但我真的不知道如何从用户那里获取输入...使用字符串允许我搜索逗号和你知道的 2 个数字.. 我确定有办法,但我想不通,所以我按照书上写的这个方法。所以输入肯定是数字,并且肯定会有重复的值......我需要首先确定值的重复(我尝试通过 getValues() 这样做并且它有效)但后来我无法替换对应的键较小的键:(我搜索了整个API ...

标签: java if-statement map iterator key-value


【解决方案1】:

最简单的解决方案似乎是在 for 循环的每次迭代中查看反向映射,看看它是否已经有一个带有键 valueE 的条目。如果是,看看keyY的新潜在值是否更小,如果是,则将其放入映射中(这样做会替换旧值)。

您可以使用Integer.parseInt(whateverString)String 值转换为ints 以​​进行比较。

最后,如果条目的当前值为 null(在这种情况下意味着不存在先前的条目),则将新值放入映射中。

所以,像这样:

import java.util.*;
import java.io.PrintStream;

public class KeyValueSwitcher {

    public static void main(String[]args) {
        PrintStream output=new PrintStream(System.out);
        Scanner input=new Scanner(System.in);


        Map<String, String>normal=new HashMap<String, String>();

        output.println("Enter your map, one key-value pair per line,");
        output.println("comma-separated. Use empty line as sentinel.");

        for(String entry=input.nextLine();entry.length()!=0;
        entry=input.nextLine()) {
            int comma=entry.indexOf(",");
            String key=entry.substring(0,comma);
            String value=entry.substring(comma+1);
            normal.put(key,value);

        }
        output.println(normal);

        Map<String, String>reverse=new HashMap<String, String>();

        for(Map.Entry<String, String>entry:normal.entrySet()) {

            String keyY=entry.getKey();
            String valueE=entry.getValue();
            // check to see if we've already put an entry in the reverse map for this key.
            String existingReverseValue = reverse.get(valueE);
            if(existingReverseValue != null) {
                // We have, so let's see if the value is greater or less
                int currentValue = Integer.parseInt(existingReverseValue);
                int potentialNewValue = Integer.parseInt(keyY);
                if(potentialNewValue < currentValue) {
                    // Old reverse value is greater, so replace with new reverse value
                    reverse.put(valueE, keyY);
                }
            } else {
                // No previous reverse value exists, so add new reverse value
                reverse.put(valueE,keyY);
            }
        }
        output.println(reverse);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多