我是arraylists的新手,想知道我怎么知道传入参数数组是否属于哪种类型(String,Int,Double ..)以及如何处理以下方法?:
public static <T> Pair<T, Integer> mode(T items[])
第二种类型总是一组Integers
,但T(第一种类型)可以是任何其他类型,如Integer,Double,String ......等。我需要提取传递给方法的最常用字符(或数字,或字符串......)的数量。在测试文件中,我有这样的想法:
@Test(timeout=2000) public void string_mode_3(){
test_mode(new String[]{"b","a","b","a","b","c","b"},
"b",4);
或
@Test(timeout=2000) public void integer_mode_1(){
test_mode(new Integer[]{30,10,10,20},
10,2);
如何在方法mode()
中找出第一个类型是Integer,Double,String?
public class Pair<X,Y>{
private X first;
private Y second;
public Pair(X x, Y y){
this.first = x;
this.second = y;
}
public X getFirst(){
return this.first;
}
public Y getSecond(){
return this.second;
}
public boolean equals(Object o){
if(!(o instanceof Pair)){
return false;
}
Pair p = (Pair) o;
return
this.first.equals(p.first) &&
this.second.equals(p.second);
}
public String toString(){
return String.format("(%s,%s)",first,second);
}
}
import java.util.ArrayList;
public class Mode {
public static <T> Pair<T, Integer> mode(T items[])
{
return
}
}
答案 0 :(得分:1)
您实际上并不需要知道实现此目的的数组元素的类型。请注意,您只需要计算每个元素出现的次数,它们的类型无关紧要。
这是使用泛型的优点之一:您可以创建可以透明地用于许多不同类型的代码。
这样的事情会起作用:
public static <T> Pair<T, Integer> mode(T items[]) {
// If the array is empty, return a dummy pair object
if (items.length == 0) {
return new Pair(null, 0);
}
// Create a map to store the elements count
Map<T, Integer> countFromItem = new HashMap<>();
// For each item in the array
for (T item : items) {
// Get the current count
Integer count = countFromItem.get(item);
// If there is no current count
if (count == null) {
// Set the count to 0
count = 0;
}
// Add 1 to the item current count
countFromItem.put(item, count + 1);
}
// After we found correct count for each element
T mode = null;
int maxCount = 0;
// Go through each entry (element: count) in the map
for (Map.Entry<T, Integer> entry : countFromItem.entrySet()) {
// If the this entry count is greater than the greatest count until now
if (entry.getValue() > maxCount) {
// This entry element is the mode
mode = entry.getKey();
// This entry count is the maxCount
maxCount = entry.getValue();
}
}
return new Pair(mode, maxCount);
}
答案 1 :(得分:0)
您可以尝试使用instanceOf来检查objec的类型。对于泛型,你可以使用Integer,Double对象并对此进行检查..只是一个hack :)快乐编码.. 编辑:附上我的一个代码供您参考
if (objectVal instanceof Double) {
errors.add(CommonValidatorUtil.isNegative(field.getName(), (Double) field.get(obj)));
} else if (objectVal instanceof Long) {
errors.add(CommonValidatorUtil.isNegative(field.getName(), (Long) field.get(obj)));
} else if (objectVal instanceof String) {
errors.add(CommonValidatorUtil.isNegative(field.getName(), Double.valueOf((String) field.get(obj))));
} else if (objectVal instanceof Integer) {
errors.add(CommonValidatorUtil.isNegative(field.getName(), (Integer) field.get(obj)));
}