Java 使用LinkedHashMap到列表时映射值不正确

Java 使用LinkedHashMap到列表时映射值不正确,java,Java,我将初始化所谓的LZWDictionary,以从提供的字符串中的唯一字符集中获取一组初始条目 在提供的输入字符串中遇到唯一字符时,会将其添加到映射中,索引值会增加(从索引0开始)。同时,字符被添加到列表中。因此,与地图中每个词典条目相关联的索引与它们在列表中的索引(位置)相关 下面是我在思考过程中使用注释尝试的代码 // Initialising map map = new LinkedHashMap<>(); // Initialising list list = new Arra

我将初始化所谓的
LZWDictionary
,以从提供的字符串中的唯一字符集中获取一组初始条目

在提供的输入字符串中遇到唯一字符时,会将其添加到映射中,索引值会增加(从索引0开始)。同时,字符被添加到列表中。因此,与地图中每个词典条目相关联的索引与它们在列表中的索引(位置)相关

下面是我在思考过程中使用注释尝试的代码

// Initialising map
map = new LinkedHashMap<>();
// Initialising list
list = new ArrayList<>();
// Declaring String variable for holding character
String str;
// Declaring index variable for holding Value
int index;

// If block for checking empty string.
if (characters.length() == 0)
    // Throwing IllegealArgumentException if String is empty.
    throw new IllegalArgumentException("Input should not be empty!!!");
else {

    // Iterating over the String
    for (int i = 0; i < characters.length(); i++) {
        // Taking particular character in the Iteration
        str = "" + characters.charAt(i);
        // Checking value of a particular character in the map
        if (map.get(str) == null) {

            // If not present in map, then add that to the map and list
            map.put(str, 1);
            list.add(str);
        }

        else {

            index = map.get(str);
            map.replace(str, index + 1);
        }

    }
}
//初始化映射
map=newlinkedhashmap();
//初始化列表
列表=新的ArrayList();
//声明用于保存字符的字符串变量
字符串str;
//声明用于保存值的索引变量
整数指数;
//用于检查空字符串的If块。
if(characters.length()==0)
//如果字符串为空,则抛出IllegealArgumentException。
抛出新的IllegalArgumentException(“输入不应为空!!!”;
否则{
//在字符串上迭代
对于(int i=0;i
我得到了一个java.lang.AssertionError,其中“a”的索引值在映射中不正确,但在映射中是正确的。示例代码是:

LZWDictionary act = new LZWDictionary("ababababa");
List<String> exp = Arrays.asList("a","b");
LZWDictionary法案=新的LZWDictionary(“ababababa”);
List exp=Arrays.asList(“a”、“b”);

这部分代码与您描述的完全不同:

if (map.get(str) == null) {

    // If not present in map, then add that to the map and list
    map.put(str, 1);
    list.add(str);
}

else {

    index = map.get(str);
    map.replace(str, index + 1);
}
您希望输入
“ababababa”
返回一个列表
[a,b]
,即唯一字符,以及一个带有
{a:0,b:1}
的映射,对吗?并且输入
“aaaabbbbbbbb”
应该给出相同的结果,对吗

因此,结果列表和结果映射只会在看到字符时第一次更新,对吗

这意味着上面的代码不应该有
else
子句。摆脱它

此外,地图应该具有唯一字符的索引。但是你有
map.put(str,1)
。他们不可能都在指数1,是吗


重新思考你在做什么。

这部分代码根本不是你所描述的:

if (map.get(str) == null) {

    // If not present in map, then add that to the map and list
    map.put(str, 1);
    list.add(str);
}

else {

    index = map.get(str);
    map.replace(str, index + 1);
}
您希望输入
“ababababa”
返回一个列表
[a,b]
,即唯一字符,以及一个带有
{a:0,b:1}
的映射,对吗?并且输入
“aaaabbbbbbbb”
应该给出相同的结果,对吗

因此,结果列表和结果映射只会在看到字符时第一次更新,对吗

这意味着上面的代码不应该有
else
子句。摆脱它

此外,地图应该具有唯一字符的索引。但是你有
map.put(str,1)
。他们不可能都在指数1,是吗


重新思考你在做什么。

编辑了@20191105:删除了@Andreas建议的额外“int”变量,从而简化了代码


因此,代码的问题是对相同输入字符的重复处理(如果您只想计算第一次遇到的外观)

然后,正如@Andreas所提到的,为了获得您所描述的内容,代码应该按如下所示进行更改:

    // Declaring index variable for holding Value
    //int index = 0;

//在字符串上迭代
对于(int i=0;i
编辑@20191105:按照@Andreas的建议,通过删除额外的“int”变量简化了代码


因此,代码的问题是对相同输入字符的重复处理(如果您只想计算第一次遇到的外观)

然后,正如@Andreas所提到的,为了获得您所描述的内容,代码应该按如下所示进行更改:

    // Declaring index variable for holding Value
    //int index = 0;

//在字符串上迭代
对于(int i=0;i