例如,对于String x
,可以通过x.length()
来衡量字符数
与ArrayList类似,使用.size()
方法可以满足它的大小。
我想设置一个可以通过不同类型对象的for循环。
答案 0 :(得分:1)
可能?当然。当然,一个巨大的if块,测试各种可能性,将是最基本(和丑陋)的想法。另一种方法是使用反射并查找例如size()
方法。也不是很漂亮。
不幸的是(对你而言),这些类不共享一个公共接口,因为sice()
方法在每个类中都有非常不同的含义。
答案 1 :(得分:1)
我想设置一个可以通过不同类型对象的for循环。
如已经提到的,尺寸/长度可以具有不同的每种类型的含义,并且通常甚至对于一种类型而言取决于语义,例如,内存中的大小与字符串中的字符数等。
除了通过size / length + index循环遍历这些元素之外,因为使用该索引的方法也不同,例如, charAt(idx)
表示字符串与get(idx)
表示列表。索引的附加访问并不总是可行的,例如,套装。
除此之外,你可能会使用Iterable<T>
来使用foreach循环,即使用隐式只读迭代器循环遍历所有元素。
这样的事情:
<T> void loop(Iterable<T> i) {
for( T element : i ) {
//whatever
}
}
虽然这对于字符串开箱即可,因为你只能为它们获取原始数组,因此你需要一个能够翻译&#34;介于char[]
和Iterable<Character>
之间。
答案 2 :(得分:0)
嗯,所有对象的长度/大小可能有不同的含义。对于List,size表示其中的元素数,String长度表示String中的字符数。两者虽然类似物不同。
因此,没有这样的常用方法。尺寸/长度在不同情况下可能具有不同的含义。
您可能希望定义一个公共接口,该接口由所有需要的类扩展,并在每个子类中定义此类方法。
答案 3 :(得分:0)
我认为没有一种简单的方法可以做到,但您可以尝试使用Java Reflection。
以下是一个示例:
public static void main(String[] args) {
// Sample input
List<Object> inputList = new ArrayList<Object>();
inputList.add("This is a String");
List<String> tmp = new ArrayList<String>();
tmp.add("A");
tmp.add("B");
tmp.add("C");
inputList.add(tmp);
inputList.add(new Integer(0));
// Create a map that hold the Class to Method relationship
Map<String, String> classMethodPairs = new HashMap<String, String>();
classMethodPairs.put("java.lang.String", "length");
classMethodPairs.put("java.util.ArrayList", "size");
// ... Add other class and method you like to use in the loop
// Go through the list of input objects
for (int i = 0; i < inputList.size(); i++) {
Object aObj = inputList.get(i);
// Find out the class name of the object
String aObjClassName = aObj.getClass().getName();
// Find out the method corresponding to the class from the map
String sizeMethodName = classMethodPairs.get(aObjClassName);
if (sizeMethodName != null) {
try {
// Get the method object
Method sizeMethod = aObj.getClass().getMethod(sizeMethodName);
// Use the method object to get the size
System.out.println(aObjClassName + " == " + sizeMethod.invoke(aObj));
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
System.err.println("Class " + aObjClassName + " does not has method " + sizeMethodName);
}
} else {
System.err.println("Unable to handle class " + aObjClassName);
}
}
}
这是输出:
java.lang.String == 16
java.util.ArrayList == 3
无法处理类java.lang.Integer
有关Java反射的更多信息:https://docs.oracle.com/javase/tutorial/reflect/