一个文本文件中约有10万多行的数据,每个数据占一行(数据为一个整数)。要求:统计出总行数,并找出出现次数最多的那个整数。大家帮忙,关键是怎样找出出现次数最多的那个数
解决方案 »
- 小弟写了两个程序,能编译但不能运行,键盘事件
- 新手。ASCII左右移问题
- 一个简单的运算想了很久没想出来!
- 谁用Jericho HTML Parser,看看Source的public Element findNextElement(int pos, java.lang.String name)方法
- http请求的连接中获取OutputStream出现异常,求高手指点!(急)
- 想找一个系统函数的相关信息怎么办?
- 求助!
- 寻JDK 1.4 中文文档下载地址,真的有1.4的中文文档吗?
- 关于线程调度
- 如何制作无级进度条控件?
- (在线视频)陈宝峰视频教程-Java中的基本类型与变量定义
- 关于java网页编程的一些问题
基本思路是使用一个List和一个Set,用List来保存单词(或者你的数字),再用Set来保存每个单词出现的行号,如果不用行号的话就不用Set了,定义一个类
Class YourClass{
int number; //你的数字
int count; //出现个数
}
读文件然后保存吧,如果是数据量很大,可以把文件分拆成几个部分来统计
import java.util.ArrayList;public class TestArray { /*
* public Object []getList(){//获得数组! try{ ArrayList list=new ArrayList();
* BufferedReader in = new BufferedReader(new FileReader("d:\\test"));
* String str; if((str=in.readLine())!=null){ list.add(str);
* } return list.toArray();
*
* }catch(Exception e){ e.printStackTrace(); return null; } }
*/
public Object[] getList() {// 测试数组
String[] bb = new String[200];
for (int i = 0; i < bb.length; i++) {
bb[i] = String.valueOf((int) (Math.random() * 50));
}
return bb;
} public int getSize() {// 统计出总行数
Object[] o = getList();
return o.length;
} public int[] getMaxSameNo() {// 找出出现次数最多的那个数组 Object o[] = getList(); int no[] = new int[o.length];
for (int i = 0; i < o.length; i++) {
no[i] = Integer.parseInt((String) o[i]); }
java.util.Arrays.sort(no);// 数组排序
for (int i = 0; i < no.length; i++) {
System.out.println("array[" + i + "]=" + no[i]);
} int maxsum = getSum(no);// 出现次数最多的数到底出现了几次
return getInt(no, maxsum);// 找出出现次数最多的那个数 } public int getSum(int[] no) {// 此方法返回出现次数最多的数到底出现了几次!
ArrayList sumlist = new ArrayList();
int sum = 1;
for (int i = 0; i < no.length - 1; i++) {
if (no[i] == no[i + 1]) {
sum++;// 相临两个相等计数器+1
} else {
// 不相等向集合里加入
sumlist.add(sum);
// 计数器复位继续比较
sum = 1;
continue;
}
}
int max = 0;
for (int i = 0; i < sumlist.size(); i++) {// 此循环取出集合里最大的数!
if (Integer.parseInt(sumlist.get(i).toString()) > max) {
max = Integer.parseInt(sumlist.get(i).toString());
}
}
return max;
} public int[] getInt(int[] no, int a) {// 此方法返回出现次数为a的数组,可能有多个数字出现相同的次数的情况,所以返回的是数组
ArrayList sumlist = new ArrayList();
int sum = 1;
for (int i = 0; i < no.length - 1; i++) {
if (no[i] == no[i + 1]) {
sum++;
} else {
if (sum == a) {
sumlist.add(no[i]);
System.out.println(no[i] + "一共出现了" + a + "次!");
} else {
sum = 1;
continue;
} }
}
int aa[] = new int[sumlist.size()];
for (int i = 0; i < aa.length; i++) {
aa[i] = Integer.parseInt((sumlist.get(i).toString()));
}
return aa; } /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
TestArray test = new TestArray();
int count = test.getSize();
System.out.println("一共有" + count + "条记录!");
int[] max = test.getMaxSameNo();
System.out.println("出现次数最多的数为:");
for (int i = 0; i < max.length; i++) {
System.out.print(max[i] + ",");
} }}
import java.util.ArrayList;public class TestArray { /*
* public Object []getList(){//获得数组!
* try{ ArrayList list=new ArrayList();
* BufferedReader in =
* new BufferedReader(new FileReader("d:\\test"));
* String str;
* if((str=in.readLine())!=null){
* list.add(str);
* }
* return list.toArray();
*
* }catch(Exception e){
* e.printStackTrace();
* return null; }
* }
*/
public Object[] getList() {// 测试数组
String[] bb = new String[200];
for (int i = 0; i < bb.length; i++) {
bb[i] = String.valueOf((int) (Math.random() * 50));
}
return bb;
} public int getSize() {// 统计出总行数
Object[] o = getList();
return o.length;
} public int[] getMaxSameNo() {// 找出出现次数最多的那个数组 Object o[] = getList(); int no[] = new int[o.length];
for (int i = 0; i < o.length; i++) {
no[i] = Integer.parseInt((String) o[i]); }
java.util.Arrays.sort(no);// 数组排序
for (int i = 0; i < no.length; i++) {
System.out.println("array[" + i + "]=" + no[i]);
} int maxsum = getSum(no);// 出现次数最多的数到底出现了几次
return getInt(no, maxsum);// 找出出现次数最多的那个数 } public int getSum(int[] no) {// 此方法返回出现次数最多的数到底出现了几次!
ArrayList sumlist = new ArrayList();
int sum = 1;
for (int i = 0; i < no.length - 1; i++) {
if (no[i] == no[i + 1]) {
sum++;// 相临两个相等计数器+1
} else {
// 不相等向集合里加入
sumlist.add(sum);
// 计数器复位继续比较
sum = 1;
continue;
}
}
int max = 0;
for (int i = 0; i < sumlist.size(); i++) {// 此循环取出集合里最大的数!
if (Integer.parseInt(sumlist.get(i).toString()) > max) {
max = Integer.parseInt(sumlist.get(i).toString());
}
}
return max;
} public int[] getInt(int[] no, int a) {// 此方法返回出现次数为a的数组,可能有多个数字出现相同的次数的情况,所以返回的是数组
ArrayList sumlist = new ArrayList();
int sum = 1;
for (int i = 0; i < no.length - 1; i++) {
if (no[i] == no[i + 1]) {
sum++;
} else {
if (sum == a) {
sumlist.add(no[i]);
System.out.println(no[i] + "一共出现了" + a + "次!");
sum=1;
continue;
} else {
sum = 1;
continue;
} }
}
int aa[] = new int[sumlist.size()];
for (int i = 0; i < aa.length; i++) {
aa[i] = Integer.parseInt((sumlist.get(i).toString()));
}
return aa; } /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
TestArray test = new TestArray();
int count = test.getSize();
System.out.println("一共有" + count + "条记录!");
int[] max = test.getMaxSameNo();
System.out.println("出现次数最多的数为:");
for (int i = 0; i < max.length; i++) {
System.out.print(max[i] + ",");
} }}
import java.io.File;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Arrays;
public class TestSum {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ArrayList<Integer> dataSet = new ArrayList<Integer>(500) ;
File f = new File("存储数据集的文件") ;
RandomAccessFile ras = new RandomAccessFile(f, "r");
String str = ras.readLine();
int count = 0; // count用来存储数据量
while (str != null) {
dataSet.add(Integer.parseInt(str)) ;
count++ ; //读取一个数,count++
str = ras.readLine();
}
ras.close();
//读取数据结束
Integer[] a = new Integer[dataSet.size()] ;
a = (Integer[])dataSet.toArray() ;//变成数组存放
Arrays.sort(a);
numSum aa = new numSum(Integer.MIN_VALUE) ;//存储最大的
numSum bb = new numSum(Integer.MAX_VALUE) ;//临时的
for (int i = 0; i < a.length; i++) {
if(a.length - 1 == i)
break ;
if(a[i] == a[i + 1]){
bb.value = a[i] ;
bb.sum = 1 ;
while(a[i] == a[i + 1]){
// bb.value = a[i] ;
bb.sum ++ ;
i++ ;
if(a.length - 1 == i)
break ;
}//while
// i -- ;
}//if
if(bb.sum > aa.sum){
aa.sum = bb.sum ;
aa.value = bb.value ;
}//if
}//for
System.out.println("数据量为:" + count);
System.out.println("最大数为:" + aa.value + " 数的个数为: " + aa.sum);
}//main
}//testSum
class numSum{
int value ;
int sum = 0 ;
public numSum(int value ){
this.value = value ;
this.sum = 0 ;
}
}
60多行
基本思路就是:
首先读取数据,因为一行只有一个数据,所以在读取的过程中可以完成两个步骤,1,数据量的计算,每读取一行,count++ ,同时把数据存储到一个链表中,
然后把链表转换为数组,利用Arrays的静态方法sort()完成数组的排序
最后根据排序好的数组计算哪个数出现的最多
最后输出
类numSum可以简单的看作一个结构
主要是存储一个整数和该整数出现的次数
完全可以用两个变量代替
我不会编程
也来说说思路从上往下读,举个例子
如果第一行的数字 为10 ,然后记录,10(数字) 1(次数)
然后第二行的数字为5,记录 5 1
第三行的数字又是10 ,然后记录为10 2
.
.
.
.
.
.
最后得到一系列的数字,为A 几次, B 几次,C 几次......
把各个数字的次数相加就是总行数,次数最多的那个数字,就是出现了最多次数的数字.
最简单的应该是hashtable将解吸出来的数字加到hashtable里面,其中数字做为key,每加一个数字对应key的value+1(充分利用hashtable 的key不可重复)最后比较value 最大的对应的key就是哪个数了!
比如说第一位的是这句出现问题:sumlist.add(sum);
它提示:The method add(int, Object) in the type ArrayList is not applicable for the
arguments (int)
哪出问题了吗?新人求指教哈
比如说第一位的是这句出现问题:sumlist.add(sum);
它提示:The method add(int, Object) in the type ArrayList is not applicable for the
arguments (int)
哪出问题了吗?新人求指教哈
你的文件有多少数据?
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class StatData { public static void main(String[] args) {
StatData.stat("F:/Data.txt");
} public static void stat(String file) {
FileReader fr = null;
BufferedReader br = null;
Set<Integer> set = new HashSet<Integer>();
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
Integer max = null;
int m = 0;
try {
fr = new FileReader(file);
br = new BufferedReader(fr);
String str = null;
int total = 0;
while((str =br.readLine()) != null) {
int i = Integer.parseInt(str);
boolean flag = set.add(i);
if(flag) {
map.put(i, 1);
} else {
int count = map.get(i).intValue();
count++;
map.put(i, count);
}
total++;
}
System.out.println("数据总共有 " + total + "行");
Object[] obj = set.toArray();
for(int j = 0; j < map.size(); j++) {
int value = map.get((Integer)obj[j]).intValue();
if(value > m) {
max = (Integer)obj[j];
m = value;
}
}
System.out.println("出现次数最多的数为:" + max);
System.out.println("出现了: " + m + "次");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(br != null) br.close();
if(fr != null) fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
数据结构:每个节点两个属性1,value数值;2,count值为等于该value值的数的个数。
实现步骤:1,建一棵空树;2,每读一行数,先找树中是否有等于value值的节点,有则该节点的count加1,否则将数插入树中,使该树仍为二叉排序树,直到遍例完十万多行数;3,对所有节点的count值进行比较,取最大相应的节点value值为所需。
俺也做过
我的思路是一条一条读,不能一次读那么大的数据量,系统可能承受不了那么大的冲击
同时count++,同时比较该条有没有出现过
然后用个什么东西都可以,记录出现了数及出现的次数
最后再查出出现最多的
好像速度还可以不过最后也没去成那家公司:(
0.3个变量,count=0;记录总行数,maxCountValue,maxCount=0;
1.打开文件(考虑buffer的方式)
2.for(每一行){
int tempValue=这一行数据;
Map中有,+1;
没有,新增;
同时记录最后一次加入的次数是否最多的,不用整个完了之后再找一遍
}
粗略估计下,整数*10w 也就是4M的内存,所以完全可以统统读入内存加以处理的。
基本思路就是数组+冲突
数组包含两个域 :data 和 selfCount,可以用相邻的奇数和偶数索引表示
遍历一遍(当然同时要countAll number),插入到数组中,当然此处应该使用插入排序的,因为以后要逐个查找匹配(可用折半查找),若有匹配,然后相应的selfCount++,处理下一条;若没有,则插入排序到相应的索引处。直到结束时,遍历一遍数组,去最大的selfCount即可