java 容器的简单问题 高手 几秒就解决 在java容器中(如List),怎样得到出现次数最多的那个元素? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ...也是一个经常性的问题了...给你一个思路 不管什么容易 你把里面的元素取出来组成一个字符串str 可以吧?这个字符串的长度为m 然后遍里容器内的元素 然后利用字符串替换,把str里的所有该元素替换掉 然后这个新字符串的长度是n 该元素对应的字符串长度是a的话 那么该元素出现的次数就是(m-n)/a 我的想法是先吧list的东西全部放到个set里面那重复的就没有了然后一个个依次比较找到相同的就+1.。。最后把这个字符和在list里占多少个的数字存在个list里面然后再找出数字最大的对应的字符貌似烦了点。。额 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); }} 直接计数 一次循环遍历list 碰到相同元素就在该元素的计数器上+1 我的代码里没有对原始LIST进行保存, 实际做的时候最好用副本做 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; }} 貌似用map做的想法比较直接,不知道有什么更发散的算法呢 ...你不保存每个元素出现的次数 你来考虑一下这个情况:list里有[1,1,2,2,3,3],你只能返回3出现了2次,而不能返回1和2都出现了2次 想了想,設一個與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... correspondingCounterArray初始化为0就可以了 第一点,自己写循环算法,,比较普遍的,就跟楼上那些一样,你自己也可以想到,就是一个设计循环的问题,第二点,查看api,融合一些其他的类库,看有没有提供一些其他的方法来解决,第三点:可以自己想想思路,看有没有更好的处理方法,比如楼上有人说的,可以设计字符串来处理,呵呵,学习无止境 如何按一个按钮在界面上生成一个表格? postfix increment expression 用渲染器渲染jtree的棘手问题 求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络 请教一下学习方向,多谢 哪位有jsp实现的树型菜单,给我一个 java调用c开发的动态链接库时,当动态链接库是指针时,在java程序中应如何相应改变 帮同学问:java中实现一个记事本!有菜单栏,有“文件”“察看”“编辑”“帮助” 有问题请教大神了 Java 有没有象C一样的断言(ASSERT)? 新手求助文本框自动获得焦点 如何为 SWT 的 Button 添加 弹出式菜单?
给你一个思路 不管什么容易 你把里面的元素取出来组成一个字符串str 可以吧?这个字符串的长度为m 然后遍里容器内的元素 然后利用字符串替换,把str里的所有该元素替换掉 然后这个新字符串的长度是n 该元素对应的字符串长度是a的话 那么该元素出现的次数就是(m-n)/a
然后一个个依次比较找到相同的就+1.。。最后把这个字符和在list里占多少个的数字存在个list里面
然后再找出数字最大的对应的字符
貌似烦了点。。额
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);
}
}
遍历list 碰到相同元素就在该元素的计数器上+1
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;
}}
for (item : List) {
if (correspondingCounterArray[item.index] > 1) continue;
counter = 1;
for (subsequent : List) {
if (item.equals(subsequent)) {
correspondingCounterArray[subsequent.index] = ++counter;
}
}
}然後由後到前查找correspondingCounterArray...
correspondingCounterArray初始化为0就可以了
第二点,查看api,融合一些其他的类库,看有没有提供一些其他的方法来解决,
第三点:可以自己想想思路,看有没有更好的处理方法,比如楼上有人说的,可以设计字符串来处理,呵呵,学习无止境