我需要在单词中获取字母索引,例如:
SOMEWORDS | 743295618
D - 单词中的第一个字母(相对于字母),所以_ _ _ _ _ _ _ 1 _ E - 秒 - > _ _ _ 2 _ _ _ 1 _ M - 第三 - > _ _ 3 2 _ _ _ 1 _ ...等
STAR | 3412
LETTER | 314526
所以,我需要在java上编写函数,该函数使用String并使用索引获取带有索引或int数组的int! 抱歉我的英文不好!
答案 0 :(得分:0)
假设您的字母和单词仅包含大写ASCII字母,您可以这样定义:
private static final int[] ALPHABET = [
12, // A is at index 12
7, // B is at index 7
...
22 // Z is at index 22
}
然后你只需要对字符串的每个字符进行迭代(你应该能够做到这一点,或者至少使用String javadoc来解决它),并使用获取字母表中该字符的索引
int index = ALPHABET[currentCharacter - 'A'];
对于更通用的解决方案,您可以将字母表定义为Map<Character, Integer>
,其中键是字母表中的所有字符,值是字母表中字符的索引。
然后你会使用
int index = ALPHABET.get(currentCharacter);
答案 1 :(得分:0)
有很多方法可以解决这个问题(我刚刚再次阅读了这个问题并发现我之前可能误解了,所以更新了这个答案)。
我认为最简单的是双循环。外循环依次取字母表中的每个字母。但是,开始声明int
数组与单词的长度相同。同时将已编号字母的计数初始化为0.如果使用大写英文字母,则外循环可以是for (char letter = 'A'; letter <= 'Z'; letter++)
。内循环一次通过你的单词一个字符。如果char与字母相同,则递增计数器并将其分配到与单词中的位置对应的int
数组的位置。例如,在检查LETTER
E
时,您将在索引1(从0开始)遇到它,因此将数字1放入数组的索引1中。您将在索引4处再次遇到E
,将计数器增加到2并将此2分配给数组的索引4。完成字母表后,阵列的所有单元格都应该有不同的数字。如果数组中仍然有0,那是因为该单词包含的内容不是大写的英文字母。
通常情况下,大多数字母都不在你的单词中,因此大多数时候通过外循环,什么都不会发生。别担心这个。除此之外,该方法几乎模仿了您在问题中概述的过程。它首先在正确的位置填充1,然后填充2,依此类推。
另一种选择是对字母进行排序。但你仍然需要跟踪他们来自哪里。因此,对于此选项,声明一个具有两个字段的类,即原始单词中的字母及其索引。对于单词的每个字母,创建该类的对象。将所有对象放入列表或数组中。 LETTER
将变为类似[L0, E1, T2, T3, E4, R5]
按字母对列表或数组进行排序。让类实现Comparable
接口可能最简单(Comparator
是另一种选择)。使用标准的Java sort
方法,例如Collections.sort()
或List.sort()
。这些是稳定的,也就是说,不会交换相同的字母,因此您可以确保之前的列表或数组将被排序为[E1, E4, L0, R5, T2, T3]
。现在循环浏览此列表。对于每个对象,将1添加到对象的索引,并将此总和分配到从对象获得的索引中的int
数组(如前所述)。示例:在索引0处您有E1,因此将0 + 1(即1)放入yourNumberArray[1]. At index 1 you have E4, so put 1 + 1 into
yourNumberArray [4]。这将得到与第一种方法相同的结果。
旧答案
旧答案会为LETTER
提供214413。我相信你现在需要315624没有重复的数字。
第一步是按字母顺序对单词的字母进行排序,以确定字母表中单词的顺序。字母的自然顺序与英文字母中的顺序一致(如果你需要其他字母表,这是一个复杂的问题,但它可以完成,而不是太难),这可以缓解这种情况。如果您只是对所有字母进行排序,例如,LETTER
变为EELRTT
,则由于重复,排序数组中的位置与订单不完全对应。
为了同时排序和删除重复项,我建议您使用TreeSet<Character>
。只需将单词的所有字母添加到集合中,它将忽略重复。将集合中的字符取出为String
(您可以使用集合的stream
或其iterator
方法,按正确的顺序分发字符,并{{1} })。使用字符串的StringBuilder
方法确定排序字符串中char的索引(只要给出方法indexOf(int)
,无论参数类型为char
)。向索引添加1,因为索引从0开始,您需要一个基于1的数字(您不需要203415用于int
,而是314526)。就是这样。
我会把编码留给你。快乐的编码。