Arraylist有两种类型:如何确定第一种类型?

时间:2015-04-03 06:19:06

标签: java arraylist

我是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 
    }



}

2 个答案:

答案 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)));
            }