我有:
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
a有唯一的密钥,我第一次丢失了
我怎么数字母?
发布于 2022-10-12 00:48:42
交换地图的键值。使用键号,因为它将是唯一的。
使用NavigableMap
来保持它们的有序性。
NavigableMap< Integer , String > = new TreeMap<>() ;
使用常规样式的示例代码。
String input = "ZpglnRxqenU";
int[] codePoints = input.codePoints().toArray();
NavigableMap < Integer, String > numberedCharacters = new TreeMap <>();
for ( int ordinal = 1 ; ordinal <= codePoints.length ; ordinal++ )
{
numberedCharacters.putIfAbsent(
ordinal ,
Character.toString( codePoints[ ordinal - 1 ] )
);
}
使用streams & lambdas的示例代码。同样的效果,在这种特殊情况下不一定更好。
String input = "ZpglnRxqenU";
int[] codePoints = input.codePoints().toArray();
NavigableMap < Integer, String > numberedCharacters =
IntStream
.rangeClosed( 1 , codePoints.length )
.boxed()
.collect(
Collectors.toMap(
Function.identity() ,
ordinal -> Character.toString( codePoints[ ordinal - 1 ] ) ,
( o1 , o2 ) -> o1 ,
TreeMap :: new )
);
要从地图中获取所有字符,请调用values
。得到的Collection
对象承诺按照映射键的迭代顺序进行迭代。
String recreated = String.join( "" , numberedCharacters.values() );
转储到控制台。
System.out.println( "input = " + input );
System.out.println( "numberedCharacters = " + numberedCharacters );
System.out.println( "recreated = " + recreated );
跑的时候。
input = ZpglnRxqenU
numberedCharacters = {1=Z, 2=p, 3=g, 4=l, 5=n, 6=R, 7=x, 8=q, 9=e, 10=n, 11=U}
recreated = ZpglnRxqenU
发布于 2022-10-12 01:05:35
如果要计算字符串中的字符数,请使用s.length();
。
如果要计算字符串中的不同字符数,则可以使用所编写的代码。map.size()
会给出确切的结果,因为映射只存储每个键一次(在您的例子中,字母(它们在java中称为char's,chars是字符的缩写))。
地图中的put()
是如何工作的:当您第一次向映射输入一个键时,它会被添加到您所提供的值中,而第二次则会更改该值。
发布于 2022-10-14 19:57:47
巴兹尔的解决方案应该适合你想要的东西,但是如果你严格地想要像你的例子那样建模,你可以有一个List<Pair<Character, Integer>>
来存储你的数据。有许多库提供Pair
或Tuple
结构,或者您可以创建自己的库。填充列表是个人喜好的问题,但本质上,您需要遍历字符数组,将每个字符及其索引映射到new Pair(char, idx)
中,然后将它们收集到列表中。
https://stackoverflow.com/questions/74033604
复制相似问题