我试图保留编码字符串中每个字符(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)的位置。
答案 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}
}
答案 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