基于LinkedHashMap重构原字符串的实现求助
完善convertToOldString方法实现
你的思路方向是对的,但现有代码存在两个关键问题:一是字符数组的长度计算错误(lettersHistogram.size()是不同字符的数量,而非原字符串的长度);二是缺少将字符填充到对应位置的核心逻辑。以下是完整实现:
完整代码
import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class StringManagement { private String str; private Map<Character, List<Integer>> lettersHistogram = new LinkedHashMap<>(); public void convertToOldString(){ // 处理空映射的边界情况 if (lettersHistogram.isEmpty()) { System.out.println(""); return; } // 第一步:计算原字符串的实际长度(最大位置索引 + 1) int maxIndex = 0; for (List<Integer> positions : lettersHistogram.values()) { for (int pos : positions) { if (pos > maxIndex) { maxIndex = pos; } } } char[] resultChars = new char[maxIndex + 1]; // 填充初始空格 Arrays.fill(resultChars, ' '); // 第二步:遍历映射,将字符填充到对应位置 for (Map.Entry<Character, List<Integer>> entry : lettersHistogram.entrySet()) { char currentChar = entry.getKey(); List<Integer> positions = entry.getValue(); for (int pos : positions) { // 确保位置不越界(可选,根据业务场景决定是否保留) if (pos >= 0 && pos < resultChars.length) { resultChars[pos] = currentChar; } } } // 第三步:转为字符串并打印 String oldString = new String(resultChars); System.out.println(oldString); } }
关键逻辑说明
- 数组长度计算:遍历所有字符的位置列表,找到最大的索引值,加1得到原字符串的实际长度(因为索引从0开始),比如示例中最大索引是11,所以数组长度为12,对应原字符串“HELLO SAMOS!”的长度。
- 字符填充:遍历映射中的每个字符及其位置列表,将字符逐个放到数组对应的索引位置上。
- 边界处理:增加了空映射的判断,避免出现空指针或异常;同时可选增加位置越界检查,防止非法位置破坏数组结构。
内容的提问来源于stack exchange,提问作者user13084927
相关产品推荐
相关产品推荐

