2012-01-02 89 views
0

如何在Vector中找到包含最多元素的对象? 例如:在Vector中查找包含元素数量最多的对象

int[] val1 = {1,2,3}; 
int[] val2 = {1}; 
int[] val3 = {1,2}; 
Vector<Object> d = new Vector<Object>(); // update 
c.add(val1); 
c.add(val2); 
c.add(val3); 
int answ = findBiggest(c); 

在这个例子中,answ应当等于0,因为val1包含3个数字。

+0

Integer!= int [] .......你得到编译器错误! – 2012-01-02 09:00:06

+1

你到目前为止尝试过什么?比较数字或获取矢量大小或定义类和方法时,您遇到问题吗? – 2012-01-02 09:00:54

+0

您的示例代码会产生编译器错误。向量c只需要整数,而不是int [] ..即使自动装箱也不会对此产生帮助 – AlanFoster 2012-01-02 09:01:35

回答

1

我已经通过采取改变数据类型为ArrayList中,我相信这是你本来想要的东西..的自由回答了这个

我也改变了泛型类型为Integer []过。因为我相信自动装箱有一个额外的开销,我认为这是一个很小但很好的做法? (任何人都可以证实这一点?)

public static void main(String[] args) { 
    Integer[] val1 = {1,2,3}; 
    Integer[] val2 = {1,2,3,3,3}; 
    Integer[] val3 = {1,2}; 
    ArrayList<Integer[]> c = new ArrayList<Integer[]>(); 
    c.add(val1); 
    c.add(val2); 
    c.add(val3); 
    int answ = findBiggest(c); 
    System.out.println(answ); 
} 

public static int findBiggest(ArrayList<Integer[]> list){ 
    int biggestSize = 0 
    int biggestPos = -1; 
    int i = 0; 
    for(Integer[] el : list){ 
     if(el.length >= biggestSize){ 
      biggestSize = el.length; 
      biggestPos = i; 
     } 
     i++; 
    } 

    return biggestPos; 
} 
+0

自动装箱开销将每个整数使用的内存增加至少3倍,并且需要堆分配。如果你处理几百个问题,这不成问题。巨大的问题,如果它是数百万,或处理它们的代码是性能关键和自动装箱整数导致不断缓存未命中。 – 2012-01-02 09:22:53

1
  • 首先,Vector是一个不应该再使用的过时类。如果你自己选择你的学习材料,放弃它并找到更新的东西。如果这是老师给的作业,告诉他们。
  • 您的代码将无法编译,因为你不能添加int[]Vector<Integer>
  • 您可以循环在利用集合的元素增强的for循环:

    for(int[] element : collection){ /* Do something with element */ }

  • 元素的数量通过数组的length字段找到数组。
+0

为什么矢量过时?你有什么建议作为一个更好的收集使用? – 2012-01-02 09:23:11

+0

@JJ Liu:应该使用ArrayList(10年前在Java 1.2中引入)。矢量是同步的,这使得它变得更慢并且几乎总是没用,并且它的API受到来自集合框架之前的方法的污染,其功能被来自List接口的方法复制。 – 2012-01-02 09:33:57

+0

谢谢。 ArrayList,Array,List,你会建议在特定情况下使用哪一种? – 2012-01-02 09:55:22

1

首先要注意的是,你的Vector没有得到很好的类型(应该是Vector<int[]>) 接下来这里是一个快速的方法

public int findBiggest(Vector<int[]> c) { 
    int max = -1; 
    int ok = -1; 
    int index = 0; 
    for (int[] ints : c) { 
     if (max < ints.length) { 
      max = ints.length; 
      ok = index; 
     } 
     index ++; 
    } 
    return ok; 
} 

public void test() { 
    int[] val1 = {1,2,3}; 
    int[] val2 = {1}; 
    int[] val3 = {1,2}; 
    Vector<int[]> c = new Vector<int[]>(); 
    c.add(val1); 
    c.add(val2); 
    c.add(val3); 
    int answ = findBiggest(c); 
} 

而作为michael-borgwardt说,不使用矢量出于这个原因:Vector Obsolete。简而言之,这是由于同步问题。因此,使用带有公共实现ArrayList的List抽象。你也可以使用Collection(因为索引在这里看起来并不重要)而不是List。

相关问题