如何保留编码字符串中每个字符的位置

时间:2018-11-09 18:10:20

标签: java

我试图保留编码字符串中每个字符(A-Z)的位置。我找不到用Java实现它的方法。

下面是我试图用Java重写的C ++示例。

map<Character,Integer> enc = new map<Character,Integer>();
for (int i = 0; i < encoded.length(); i++)
{
  enc[encoded.charAt(i)] = i;
}

以下示例:

我将有一个唯一的关键字,例如,关键字是NEW。 通过将关键字+字母(不在关键字中的AZ)连接起来形成字符串,例如 NEWABCDFGHIJKLMOPQRSTUVXYZ (请注意,在上面的26个字符的字符串中,N,E和W不再重复。最后,我想保留上述字符串中以粗体显示的每个字符(即AZ)的位置。

2 个答案:

答案 0 :(得分:1)

如果您不想处理重复的字母,可以执行以下操作,它只会保留每个字母的最后一次出现:

Map<Character, Integer> enc = new HashMap<>();
for (int i = 0; i < encoded.length(); i++) {
    enc.put(encoded.charAt(i), i);
}

————————

要处理重复的字符,您可以将其保存在列表中,或将它们连接成字符串(例如,第二个字符我添加一个filter操作以删除空格)

public static void main (String[] args) 
{
    String str = "AUBU CUDU";
    Map<Character, List<Integer>> mapList = 
        IntStream.range(0, str.length())
                 .boxed()
                 .collect(Collectors.toMap(i->str.charAt(i), i->Arrays.asList(i), (la,lb)->{List<Integer>res =new ArrayList<>(la); res.addAll(lb); return res;}));
    System.out.println(mapList);

    //{ =[4], A=[0], B=[2], C=[5], D=[7], U=[1, 3, 6, 8]}

    Map<Character, String> mapString =
        IntStream.range(0, str.length())
                 .boxed()
                 .filter(i->(""+str.charAt(i)).matches("[\\S]"))
                 .collect(Collectors.toMap(i->str.charAt(i), i->Integer.toString(i), (sa,sb)-> sa+sb ));
    System.out.println(mapString);

    //{A=0, B=2, C=5, D=7, U=1368}
}

Code Demo

答案 1 :(得分:1)

如果我理解您的意思,则想将字符串中的每个字符映射到其索引。但是,地图的每个条目都需要一个唯一的键,因此您的代码将无法直接用于包含重复字符的字符串。我们将使用整数列表来存储此字符显示的所有索引,而不是对每个字符使用整数。

这是在Java中执行此操作的方式:

public static void main(String[] args) {
        Map<Character, List<Integer>> charMap = new HashMap<>();

        String string = "aaabbcdefg";
        for (int i = 0; i < string.length(); i++) {
            Character c = string.charAt(i);
            if (charMap.containsKey(c)) {
                List<Integer> positions = charMap.get(c);
                positions.add(i);
            } else {
                charMap.put(c, new ArrayList<>(Arrays.asList(i)));
            }
        }

        for (Character c : charMap.keySet()) {
            System.out.print(c + ": ");
            charMap.get(c).forEach(System.out::print);
            System.out.println();
        }
    }

输出:

a: 012
b: 34
c: 5
d: 6
e: 7
f: 8
g: 9