将非数字字符串转换为整数?

问题描述 投票:3回答:6

如何将非数字字符串转换为整数?

我得到了例如:

String unique = "FUBAR";

什么是将String表示为整数而没有冲突的好方法,例如“FUBAR”应始终表示为相同的数字,并且不得与任何其他字符串冲突。例如,String a = "A";应该表示为整数1等等,但是这样做的方法是什么(最好是对所有unicode字符串,但在我的情况下,ASCII值就足够了)。

java string int type-conversion
6个回答
7
投票

这是不可能的。想想看,Integer只能是32位。因此,根据鸽子原则,无论您使用何种技术进行转换,都必须存在至少两个具有相同Integer值的字符串。实际上,有无限的相同价值观......

如果你只是在寻找一个有效的映射,那么我建议你只使用int返回的hashCode(),它实际上是31位。


3
投票

您可以使用表将字符串映射到唯一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


2
投票

如果您知道字符串中使用的字符集,那么您可以将字符串视为基数不是10的数字。例如,十六进制数字包含从A到F的字母。

因此,如果您知道您的字符串只包含来自8位字符集的字母,则可以将该字符串视为256个基数。在伪代码中,这将是:

number n;
for each letter in string
    n = 256 * n + (letter's position in character set)

如果您的字符集包含65535个字符,那么只需在每一步中将'n'与该数字相乘即可。但要注意,整数的32位很容易溢出。您可能需要使用可以容纳更大数字的类型。


1
投票
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;
}

1
投票

无论接受的答案是什么,都可以通过计算String的Gödelnumber来表示任何String作为整数,这是每个可能的字符串的素数的唯一乘积。有人说它实现起来非常不切实际且执行起来很慢,对于大多数字符串你也需要一个BigInteger而不是一个普通的Integer,并且要将Gödelnumber解码成相应的String,你需要有一个定义的Charset。


0
投票

也许有点晚了,但我要给我10美分来简化它(内部类似于@Romain Hippeau建议的BigDecimal)

public static BigInteger getNumberId(final String value) {
    return new BigInteger(value.getBytes(Charset.availableCharsets().get("UTF-8")));
}
© www.soinside.com 2019 - 2024. All rights reserved.