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

时间:2013-11-01 10:21:06

标签: java string int type-conversion

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

我得到了例如:

String unique = "FUBAR";

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

6 个答案:

答案 0 :(得分:7)

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

如果您只是在寻找有效的映射,那么我建议您只使用int返回的hashCode(),其参考值实际为31位。

答案 1 :(得分: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 :(得分: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位很容易溢出。您可能需要使用可以容纳更多数字的类型。

答案 3 :(得分: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;
}

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

public static BigInteger getNumberId(final String value) {
    return new BigInteger(value.getBytes(Charset.availableCharsets().get("UTF-8")));
}