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

Posted

技术标签:

【中文标题】将非数字字符串转换为整数?【英文标题】:Converting non-numeric String to Integer? 【发布时间】:2013-11-12 12:56:20 【问题描述】:

如何

例如:

String unique = "FUBAR";

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

【问题讨论】:

呃。这就是字符编码的作用。获取一个字符串的字节,你有一个数字。 这里的目标是什么?有多种方法可以将字符串转换为数字并保持唯一性。毕竟,由于任何数据都存储为一系列位,因此与其说是转换,不如说是重新解释。但是,如果您希望任何长度的任何字符串的结果都适合单个 Java int 值,那么您正在寻找一个散列函数,其中有很多。然而,永远不可能有一个完美的保证不会发生冲突,因为可能的字符串比整数多(鸽巢原理)。 我想不出一种适用于 all unicode 字符串(无论多长时间)并将它们转换为单个 int 的方法。但是,如果您找到可靠的方法,请回来并说出您的价格:数据压缩公司会喜欢您的 ;-) 您在寻找***.com/questions/2624192/…吗? “整数”是指 java int 还是“任意长度的整数”? 【参考方案1】:

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

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

【讨论】:

投反对票,因为它是可能的。十六进制数字包含字符,它们可以轻松转换为 10 基数而不会发生任何冲突。 @909Niklas 什么?? int idValue = (this.getClass().getName() + id).hashCode() @Torben 问题指定“没有冲突”。这是不可能的。 @Torben 没有办法保证没有冲突。如果你找到方法,请告诉我(不要告诉其他人)。 BTW Object.hashCode() 是 31 位的。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:
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;

【讨论】:

【参考方案5】:

可能有点晚了,但我会花 10 美分来简化它(内部类似于 @Romain Hippeau 建议的 BigDecimal)

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

【讨论】:

【参考方案6】:

无论接受的答案如何,都可以通过计算字符串的哥德尔数来将任何字符串表示为整数,这是每个可能字符串的素数的唯一乘积。话虽如此,实现起来非常不切实际且速度很慢,对于大多数字符串来说,您需要一个 BigInteger 而不是普通的 Integer,并且要将 Gödelnumber 解码为其相应的字符串,您需要定义一个字符集。

【讨论】:

以上是关于将非数字字符串转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章

编写一个算法,将非负的十进制整数转换为其他进制的数输出,10及其以上的数字从‘A’开始的字母表示

编写一个函数,将一个数字字符串转换为一个整数

如何使用 JavaScript 将非英文字符转换为英文

编程:将一个数字字符串转换成一个整数(不得调用C语言提供的将字符串转换为整数的函数)。

将非标准字符串转换/修改为 Python DataFrame 的日期时间

C语言中怎么将一个整数字符串转换为一个数