将非数字字符串转换为整数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将非数字字符串转换为整数?相关的知识,希望对你有一定的参考价值。
如何将非数字字符串转换为整数?
我得到了例如:
String unique = "FUBAR";
什么是将String表示为整数而没有冲突的好方法,例如“FUBAR”应始终表示为相同的数字,并且不得与任何其他字符串冲突。例如,String a = "A";
应该表示为整数1
等等,但是这样做的方法是什么(最好是对所有unicode字符串,但在我的情况下,ASCII值就足够了)。
这是不可能的。想想看,Integer
只能是32位。因此,根据鸽子原则,无论您使用何种技术进行转换,都必须存在至少两个具有相同Integer
值的字符串。实际上,有无限的相同价值观......
如果你只是在寻找一个有效的映射,那么我建议你只使用int
返回的hashCode()
,它实际上是31位。
您可以使用表将字符串映射到唯一ID。通常无法做到这一点。
final Map<String, Integer> map = new HashMap<>();
public int idFor(String s) {
Integer id = map.get(s);
if (id == null)
map.put(s, id = map.size());
return id;
}
注意:拥有唯一ID并不保证哈希集合中不会发生冲突。
http://vanillajava.blogspot.co.uk/2013/10/unique-hashcodes-is-not-enough-to-avoid.html
如果您知道字符串中使用的字符集,那么您可以将字符串视为基数不是10的数字。例如,十六进制数字包含从A到F的字母。
因此,如果您知道您的字符串只包含来自8位字符集的字母,则可以将该字符串视为256个基数。在伪代码中,这将是:
number n;
for each letter in string
n = 256 * n + (letter's position in character set)
如果您的字符集包含65535个字符,那么只需在每一步中将'n'与该数字相乘即可。但要注意,整数的32位很容易溢出。您可能需要使用可以容纳更大数字的类型。
private BigDecimal createBigDecimalFromString(String data)
{
BigDecimal value = BigDecimal.ZERO;
try
{
byte[] tmp = data.getBytes("UTF-8");
int numBytes = tmp.length;
for(int i = numBytes - 1; i >= 0; i--)
{
BigDecimal exponent = new BigDecimal(256).pow(i);
value = value.add(exponent.multiply(new BigDecimal(tmp[i])));
}
}
catch (UnsupportedEncodingException e)
{
}
return value;
}
无论接受的答案是什么,都可以通过计算String的Gödelnumber来表示任何String作为整数,这是每个可能的字符串的素数的唯一乘积。有人说它实现起来非常不切实际且执行起来很慢,对于大多数字符串你也需要一个BigInteger而不是一个普通的Integer,并且要将Gödelnumber解码成相应的String,你需要有一个定义的Charset。
也许有点晚了,但我要给我10美分来简化它(内部类似于@Romain Hippeau建议的BigDecimal)
public static BigInteger getNumberId(final String value) {
return new BigInteger(value.getBytes(Charset.availableCharsets().get("UTF-8")));
}
以上是关于将非数字字符串转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章
编写一个算法,将非负的十进制整数转换为其他进制的数输出,10及其以上的数字从‘A’开始的字母表示
2022-01-09:整数转换英文表示。将非负整数 num 转换为其对应的英文表示。 示例 1: 输入:num = 123, 输出:“One Hundred Twenty Three“。 力扣273。