在java容器中(如List),怎样得到出现次数最多的那个元素?

解决方案 »

  1.   

    ...也是一个经常性的问题了...
    给你一个思路  不管什么容易  你把里面的元素取出来组成一个字符串str  可以吧?这个字符串的长度为m   然后遍里容器内的元素  然后利用字符串替换,把str里的所有该元素替换掉  然后这个新字符串的长度是n  该元素对应的字符串长度是a的话   那么该元素出现的次数就是(m-n)/a
      

  2.   

    我的想法是先吧list的东西全部放到个set里面那重复的就没有了
    然后一个个依次比较找到相同的就+1.。。最后把这个字符和在list里占多少个的数字存在个list里面
    然后再找出数字最大的对应的字符
    貌似烦了点。。额
      

  3.   


    import java.util.*;public class FindMaxcountInList
    {
    public static void main(String [] args) throws Exception
    {
    Vector<Integer> v = new Vector<Integer>();
    v.add(1);
    v.add(2);
    v.add(3);
    v.add(4);
    v.add(2);
    v.add(3);
    v.add(4);
    v.add(5);
    v.add(2);
    v.add(9);
    v.add(10);
    v.add(8);
    v.add(7);
    v.add(2);
    v.add(4);
    v.add(2);
    System.out.println(v); int maxCount = 0;
    Object objToFind = null; while (true)
    {
    if (v.size() <= 0)
    {
    break;
    } int currentCount = 1;
    Object currentObj = v.remove(0); int begin = 0; finder :
    while (true)
    {
    for (int i = begin; i < v.size(); i++)
    {
    if (currentObj.equals(v.get(i)))
    {
    currentCount++;
    v.remove(i);
    begin = i;
    continue finder;
    }
    }
    if (currentCount > maxCount)
    {
    maxCount = currentCount;
    objToFind = currentObj;
    }
    break;
    }
    } System.out.println(objToFind + " : " + maxCount);
    }
    }
      

  4.   

    直接计数 一次循环
    遍历list 碰到相同元素就在该元素的计数器上+1
      

  5.   

    我的代码里没有对原始LIST进行保存, 实际做的时候最好用副本做
      

  6.   

    package test;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.atomic.AtomicInteger;public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    AtomicInteger i=new AtomicInteger();
    i.incrementAndGet();

    System.out.println(i);
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(2);
    list.add(9);
    list.add(10);
    list.add(8);
    list.add(7);
    list.add(2);
    list.add(4);
    list.add(2);
    list.add(1);

    int[] a = test(list);
    System.out.println(a[0]+"   "+a[1]);
    }

    public static int[] test(List<Integer> list){
    int[] a = new int[2];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    int maxCount=0;//出现次数
    int elem=0;//出现最多的元素
    for(Integer i:list){
    if(!map.keySet().contains(i)){
    map.put(i,1);
    }else{
    map.put(i, map.get(i)+1);
    }
    }
    for(Integer i:map.keySet()){
    if(map.get(i)>maxCount){
    elem = i;
    maxCount = map.get(i);
    }
    }

    System.out.println("出现最多的元素:"+elem+"   出现次数:"+maxCount);
    a[0]=elem;
    a[1]=maxCount;
    return a;
    }}
      

  7.   

    貌似用map做的想法比较直接,不知道有什么更发散的算法呢
      

  8.   

    ...你不保存每个元素出现的次数  你来考虑一下这个情况:list里有[1,1,2,2,3,3],你只能返回3出现了2次,而不能返回1和2都出现了2次  
      

  9.   

    想了想,設一個與List同長的一個數組,初始化全為1,由第一個元素開始掃瞄,
    for (item : List) {
    if (correspondingCounterArray[item.index] > 1) continue;
    counter = 1;
    for (subsequent : List) {
    if (item.equals(subsequent)) {
    correspondingCounterArray[subsequent.index] = ++counter;
    }
    }
    }然後由後到前查找correspondingCounterArray...
      

  10.   


    correspondingCounterArray初始化为0就可以了
      

  11.   

    第一点,自己写循环算法,,比较普遍的,就跟楼上那些一样,你自己也可以想到,就是一个设计循环的问题,
    第二点,查看api,融合一些其他的类库,看有没有提供一些其他的方法来解决,
    第三点:可以自己想想思路,看有没有更好的处理方法,比如楼上有人说的,可以设计字符串来处理,呵呵,学习无止境