gpt4 book ai didi

java - 从 String 到其他数据类型的运行时转换

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:27 25 4
gpt4 key购买 nike

您好,我有字符串值映射。

我想在运行时转换这个值。

例如

Map map = new HashMap();
map.put("key1","101");
map.put("key2","45.40");

现在运行时我知道 key1 是整数,key2 是 double 我该如何转换这个。

我试过这个:

("101").getClass().cast(Integer).

///////////////////////////////////////////例如............

String integerClass = "java.lang.Integer";字符串 strNum = "5";现在,您将如何使用 integerClass 将此 strNum 值“5”转换为 Integer。

.....不直接使用 new Integer(strNum)

谢谢。

最佳答案

你不能在语言上转换 String (引用类型)到 intdouble (原始数字类型)。你必须转换它们。值得庆幸的是,有一些标准方法可以为您完成:

API 链接

注意事项

T Class<T>.cast(Object) 做一些完全不同的事情。它与泛型、反射、类型标记等有关。


就是说,我注意到您使用了原始 Map类型。由于这看起来像一个新代码,应该说您不应该在新代码中使用原始类型。您可能永远不需要从 String 进行转换至 int/double首先(或者至少在之前将它们放入 map 中)。

A Map<String,Number> (或者可能是 Map<String,Double> )会更好,因为 map 是“类型安全的”;你知道它映射StringNumber ,并且编译器会确保您不会做任何违反此类型不变量的事情。

相关问题


根据 OP 的评论,看起来需要这样的东西:

import java.util.*;
public class MapTranslate {
static Object interpret(String s) {
Scanner sc = new Scanner(s);
return
sc.hasNextInt() ? sc.nextInt() :
sc.hasNextLong() ? sc.nextLong() :
sc.hasNextDouble() ? sc.nextDouble() :
sc.hasNext() ? sc.next() :
s;
}
public static void main(String[] args) {
Map<String,String> map1 = new HashMap<String,String>();
map1.put("One", "1");
map1.put("PI", "3.141592653589793");
map1.put("10^12", "1000000000000");
map1.put("Infinity", "oo");
map1.put("Blank", " ");

Map<String,Object> map2 = new HashMap<String,Object>();
for (Map.Entry<String,String> entry : map1.entrySet()) {
map2.put(entry.getKey(), interpret(entry.getValue()));
}

for (Map.Entry<String,Object> entry: map2.entrySet()) {
System.out.format("%s->[%s] (%s)%n",
entry.getKey(),
entry.getValue(),
entry.getValue().getClass().getSimpleName()
);
}
}
}

这会产生:

PI->[3.141592653589793] (Double)
Infinity->[oo] (String)
One->[1] (Integer)
10^12->[1000000000000] (Long)
Blank->[ ] (String)

这不是最可靠的(例如,它不处理 null 键/值),但它可能是一个很好的起点。请注意,它使用 java.util.Scanner 及其 hasXXX方法;这样你就不用担心任何 NumberFormatException .

但是,如果不了解大局,就很难评论这样的事情是否是一个好主意。

相关问题


使用反射

这似乎也是问题的一个方面;以下内容应该具有指导意义:

import java.lang.reflect.*;

public class ValueOfString {
static <T> T valueOf(Class<T> klazz, String arg) {
Exception cause = null;
T ret = null;
try {
ret = klazz.cast(
klazz.getDeclaredMethod("valueOf", String.class)
.invoke(null, arg)
);
} catch (NoSuchMethodException e) {
cause = e;
} catch (IllegalAccessException e) {
cause = e;
} catch (InvocationTargetException e) {
cause = e;
}
if (cause == null) {
return ret;
} else {
throw new IllegalArgumentException(cause);
}
}
public static void main(String[] args) throws ClassNotFoundException {
Integer ii = valueOf(Integer.class, "42"); // no need to cast!
System.out.println(ii); // prints "42"

Object o = valueOf(Class.forName("java.lang.Double"), "3.14159");
System.out.println(o);
System.out.println(o instanceof Double); // prints "true"
}
}

上面的代码片段使用类型标记和反射来调用 static valueOf(String)方法。然而,在这种情况下使用反射可能是不合理的,并且最好只显式检查所需的转换是什么,例如"java.lang.Integer" , 然后调用 Integer.valueOf相应地。

关于java - 从 String 到其他数据类型的运行时转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com