You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为字符串每个字符按顺序分配序号(非频率统计)

问题描述

现有字符串:

String s = "ZpglnRxqenU"

需要为字符串中的每个字符按出现顺序分配序号,示例输出如下:

z-1
p-2
g-3
l-4
n-5
r-6
x-7
q-8
e-9
n-10
u-11

需求并非统计字符频率,尝试用HashMap实现:

Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
    map.put(String.valueOf(s.charAt(i)), i + 1);
}

但由于Map的键具有唯一性,导致第一个n的记录被后续的n覆盖,请问该如何正确实现这种字符序号分配?

解决方案

方法1:直接遍历输出(最简单)

如果只是需要输出目标结果,完全不需要用Map,直接遍历字符串逐个输出即可:

String s = "ZpglnRxqenU";
for (int i = 0; i < s.length(); i++) {
    // 转小写匹配示例输出格式
    char c = Character.toLowerCase(s.charAt(i));
    System.out.println(c + "-" + (i + 1));
}

这段代码直接按顺序输出每个字符和对应序号,不会出现覆盖问题。

方法2:用Map存储所有出现的序号(需保存数据时)

如果需要持久化存储每个字符对应的所有序号,可以使用Map<Character, List<Integer>>,键为字符,值为该字符出现的所有序号列表:

String s = "ZpglnRxqenU";
// 使用LinkedHashMap保证字符顺序为首次出现的顺序
Map<Character, List<Integer>> charIndexMap = new LinkedHashMap<>();

for (int i = 0; i < s.length(); i++) {
    char c = Character.toLowerCase(s.charAt(i));
    // 若字符未在Map中,自动创建空列表
    charIndexMap.computeIfAbsent(c, k -> new ArrayList<>());
    // 将当前序号加入列表
    charIndexMap.get(c).add(i + 1);
}

// 遍历输出所有字符及对应序号
for (Map.Entry<Character, List<Integer>> entry : charIndexMap.entrySet()) {
    char c = entry.getKey();
    for (int index : entry.getValue()) {
        System.out.println(c + "-" + index);
    }
}

用LinkedHashMap替代普通HashMap,可以保证输出顺序和字符首次出现的顺序一致,完全匹配示例要求。

方法3:自定义对象存储(灵活扩展)

如果需要对字符和序号的配对进行更复杂的操作,可以创建一个简单的自定义类,用List保存所有配对:

// 自定义类,封装字符和对应的序号
class CharIndex {
    private char character;
    private int sequenceNumber;

    public CharIndex(char character, int sequenceNumber) {
        this.character = character;
        this.sequenceNumber = sequenceNumber;
    }

    // 重写toString方法,方便直接输出
    @Override
    public String toString() {
        return character + "-" + sequenceNumber;
    }
}

// 使用示例
String s = "ZpglnRxqenU";
List<CharIndex> charIndexList = new ArrayList<>();

for (int i = 0; i < s.length(); i++) {
    char c = Character.toLowerCase(s.charAt(i));
    charIndexList.add(new CharIndex(c, i + 1));
}

// 输出所有配对
for (CharIndex pair : charIndexList) {
    System.out.println(pair);
}

这种方式可以完整保留每一组字符和序号的信息,后续便于进行过滤、排序等操作。

内容的提问来源于stack exchange,提问作者IMBABOT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:21:48