enum StringInteger {
DLP_Classification_Rules(1),
Some_Other_String(2);
private int value;
StringInteger(int value) {
this.value = value;
}
public static StringInteger toInt(String value) {
try {
return StringInteger.valueOf(value);
} catch (Exception e) {
throw new RuntimeException("This string is not associated with an integer");
}
}
public static StringInteger toString(int value) {
for (StringInteger stringInteger : StringInteger.values()) {
if (stringInteger.value == value) return stringInteger;
}
throw new RuntimeException("This integer is not associated with a string");
}
}
public class StringPool {
private final Map<String, Integer> pool = new HashMap<>();
private final List<String> list = new ArrayList<>();
public int stringToInteger(String s) {
Integer result = pool.get(s);
if (result == null) {
result = pool.size();
pool.put(s, result);
list.add(s);
}
return result;
}
public String integerToString(int i) {
if (i < 0 || i >= pool.size())
throw new IllegalArgumentException();
return list.get(i);
}
}
和
StringPool pool = new StringPool();
String s = "DLP_Classification_Rules";
int i = pool.stringToInteger(s);
System.out.println(i);
String r = pool.integerToString(i);
System.out.println(r);
4条答案
按热度按时间ijnw1ujt1#
如果要转换的字符串是常量,则可以创建
Enum
对他们来说:egdjgwm82#
希望能对你有所帮助
运行结果
k2fxgqgv3#
试试这个。
和
输出:
或者你可以像这样创建一个字符串池。
和
输出:
kgsdhlau4#
base64不是,因为结果不是整数,而是字符串。你要找的基本上是把字符串无损压缩成一个数字(比int大得多),这并不容易。
这完全取决于您的用例。您是否在单个jvm上运行单个应用程序?您正在运行客户机/服务器模块吗?在应用程序运行期间是否需要保留信息?
例如,您可以使用map<integer,string>将所有字符串Map为数字,并将这些数字传递给其他人,每当您需要字符串本身时,就从Map中提取它。不过,如果您需要在本地jvm之外引用这些数字和字符串,那么除非您将Map转移到该jvm,否则不会有多大帮助。您还可以将此Map持久化到文件或数据库,以便在应用程序之间共享信息。Map中的整数键可以是一个简单的计数器,如“map.put(map.size(),s)”(但是不要从Map中删除任何内容:);或者更复杂的方法是使用字符串的hashcode()函数,该函数返回int:“map.put(s.hashcode(),s)”