java怎样将集合中的数值数据分区间统计个数:例如(0-1000)有几个人数据,1000-2000有几个数据 用JAVA如何取1831的个位数,十位数,百位数,千位数,的...

作者&投稿:漆钥 (若有异议请与网页底部的电邮联系)

集合分组统计处理, 实现的方法很多,简单的写几种方法供参考;(理解后,自行扩展完善)

方法一:(Java8流处理粗略版) 该版本存在的问题:有些区间没有数据,就不打印显示该区间

import java.util.*;
import java.util.stream.*;

public class NumberDemo {
public static void main(String[] args) {

ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

// 给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

funStream(list, space);
}

private static void funStream(ArrayList<Integer> list, int space) {
// 使用流处理 把 数字分组
Map<String, List<Integer>> map = list.stream().collect(Collectors.groupingBy((num) -> {
return "区间:[" + num / space * space + "," + (num / space + 1) * space + ")";// 分组规则
}));
map.forEach((k,v)->{
System.out.println(k);
System.out.println(""+v.size()+"个数据");
});
}
}

方法二:(Java8流处理详细版) 就算有的区间是0个数据,照样打印出来

import java.util.*;
import java.util.stream.*;

public class NumberDemo2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

// 给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

funStream(list, space);
}

private static void funStream(ArrayList<Integer> list, int space) {
// 使用流处理 把 数字分组
Map<Integer, List<Integer>> map = list.stream().collect(Collectors.groupingBy((num) -> {
return num / space;// 分组规则
}));

// 获取集合里的最大值
Optional<Integer> maxop = list.stream().collect(Collectors.maxBy(Integer::compareTo));
int max = maxop.orElse(0);
// 计算出区间的数量
int groups = max % space == 0 ? max / space : max / space + 1;
// 打印结果
for (int i = 0; i < groups; i++) {
System.out.println("区间:[" + i * space + "," + (i + 1) * space + ")");
System.out.println("有" + (map.get(i)==null?0:map.get(i).size()) + "个数据");
// System.out.println(""+map.get(i));//把数据打印出来
}
}
}

方法三:(比较传统的方法)

import java.util.*;

public class NumberDemo3 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

//给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

fun(list,space);
}
private static void fun(ArrayList<Integer> list, int space) {
Collections.sort(list);//排序
int max= list.get(list.size()-1);//取得最大值
int groups = max % space == 0 ? max / space : max / space + 1;//取得区间的数量
HashMap<Integer,ArrayList<Integer>> map=new HashMap<Integer, ArrayList<Integer>>();//存区间和该区间的数字
for (int i = 0; i < groups; i++) {
map.put(i, new ArrayList<>());
}
//把元素添加到指定的区间
for (int i = 0; i < list.size(); i++) {
map.get(list.get(i)/space).add(list.get(i));
}
//打印结果
for (int i = 0; i < groups; i++) {
System.out.println("区间:[" + i * space + "," + (i + 1) * space + ")");
System.out.println("有"+ map.get(i).size()+"个数据");
//System.out.println(""+map.get(i));//把数据打印出来
}
}
}

测试效果如下

区间:[0,1000)
有5个数据
区间:[1000,2000)
有0个数据
区间:[2000,3000)
有1个数据
区间:[3000,4000)
有2个数据
区间:[4000,5000)
有2个数据


这个问题可以通过数据结构里面的排序来完成,用快速排序法,先将1000插入数据作为基准,排序完成后,在1000左边的是比它小的,右边的数据就是比1000大的,然后取右边的数据插入2000作为基准,再用排序法得到1000-2000的数据。

也可以用直接比较法,将所有的数据与这个区间进行比较,合适的就统计个数,这个算法比较简单容易实现,就是数据量大的时候效率稍微低一点。

看到补充的问题,这个就比较复杂一点,如果是分区间保存数据,有多个区间的话,应该是用哈希表的方法比较合适,哈希函数就选用 key / 1000,解决冲突的方法还是用链表法,这样如果数据比较分散而数据量不大的话,还是有效率的。

   public int[] quickSort(int[] data){  //快速排序,不稳定,最快速
        return quickSort(data, 0, data.length -1);
    }
    
    public int[] quickSort(int[] data, int low, int high){
        int pivot = data[low];
        int i = low + 1;
        int j = high;
        int temp;
        while(i < j){
            while((j > i) && (pivot <= data[j]) ){
                -- j;
            }
            while((i < j) && (pivot >= data[i])){
                ++ i;
            }
            if(i < j){
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }
        if(data[j] < data[low]){
            temp = data[low];
            data[low] = data[j];
            data[j] = temp;
        }
        if(i - low > 1)
            quickSort(data, low, i - 1);
        if(high - j > 1)
            quickSort(data, j + 1, high);
        
        return data;
    }


创建set的iterator
Set<Object> set = new HashSet<Object>();
Iterator<Object> it = set.iterator();
while(it.hasNext())//判断是否有下一个
it.next()取出元素
======================================
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

class ADD{
public String a;

public static void main(String[] args) {
ADD a = new ADD();
a.a = "a";
ADD b = new ADD();
b.a = "b";
Set<ADD> set = new HashSet<ADD>();
set.add(a);
set.add(b);
Iterator<ADD> it = set.iterator();
while(it.hasNext()){
System.out.println(((ADD)it.next()).a);
}
}
}

这种问题建议自学 jdk1.8 stream

java中如何生成一组的随机数(范围在0-1000之间,double型的),各个数之间没有联系~

randompublic static double random()返回带正号的 double 值,该值大于等于 0.0 且小于
1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同
new java.util.Random之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。
此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。

个位数=1831%10
十位数=183%10
百位数=18%10
千位数=1%10

int i;
i = System.in.read(); //实际上要捕获异常
int units,tens,hundreds,thousands;

units = i%10;
tens = (i/10)%10;
hundreads = (i/100)%10;
thousands =(1/1000)%10;

然后再用System.out.print();函数输出结果就好

java学习作为一名java初学者,如何快速学习j
答:想要快速学习Java建议去【达内教育】学习,该机构26大课程体系紧跟企业需求,企业级项目,课程穿插大厂真实项目讲解,对标企业人才标准,制定专业学习计划,囊括主流热点技术。JAVA快速入门的方法:1、时刻提醒自己Java是一种OOP语言工具,而不仅仅是编码,只有这样才能总体把握和运用Java。2、在学习的过程中,...

Java语言的特点
答:安全性可以分为四个层面,即语言级安全性、编译时安全性、运行时安全性、可执行代码安全性。语言级安全性指Java的数据结构是完整的对象,这些封装过的数据类型具有安全性。编译时要进行Java语言和语义的检查,保证每个变量对应一个相应的值,编译后生成Java类。运行时Java类需要类加载器载入,并经由字节码校验器校验之后...

Java培训的主要内容是什么?
答:此外,还将学习设计模式,提高代码的可维护性和扩展性。3. Java核心库:学习Java标准库(Java API)中常用类和接口的使用方法,如集合框架、IO流、多线程等。通过实践项目,加深对Java核心库的理解和应用。4. 数据库与JDBC:学习数据库的基本概念、SQL语言以及使用Java连接数据库的方法。掌握如何通过JDBC...

自学Java 怎么入门?
答:学习完软件项目管理后,将掌握整个项目实际开发过程以及整个项目开发过程中所使用协同开发工具。 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学习:基础语法,可帮助你建立基本的编程逻辑思维;面向对象,以对象方式去编写优美的Java程序;集合,后期开发中存储数据...

常见的十五种Java开发工具是什么,有什么特点
答:在修改后进行编译基继续进行调试时,Visual Cafe会自动将文件存盘,使用VisualCafe创建的原生应用具有许多特点。除了明显的速度提高之外,Symantec使类库的二进制方式比正常的JDK小Visual Cafe为所指定的关系自动生成或更新必要的Java代码。利用Visual Cafe,用户可以从一个标准对象数据库中集合完整的Java应用程序和...

一次性搞懂字符集,编码,Unicode,Utf-8/16,BOM...
答:所以在JAVA里我们可以这样进行大小写转换:从字面上来理解,字符集是一个包含指定字符的集合,而编码是把文字转换成对应的数字码,确实也是这样,像AscII码,他包含了128个特定字符,并且为每个字符指定了一个序号,可以称之为字符集,编码则是像查字典一样,从字符集中查到对应的序号,再把序号按编码...

计算机软件 是怎么个概念??
答:所以软件设计就是依靠数学思想,想学软件,数学基础好会事半功倍,当然不仅仅局限于高中的数学,在大学你会接触到数学的各个分支,要学很多东西。像一些学校的应用数学专业,实际上就是计算机专业,计算机专业在后续会分为软件、互联网、数据库等分支,这种分类并不完全按照专业理论来分,也是因为世界经济...

现在学java有前途吗?没有任何计算机基础的人
答:但是要注意的是java属于新兴行业,行业标准不规范,各种培训机构水平参差不齐。有一些不责任的培训机构,虽然给出了就业承诺,但就什么样的“业”却是有很多可能的,而且学员的就业率与老师薪酬挂钩,无论怎样都会让学生就业。所以我们在选择java培训机构的过程中,最好能够进行实地考察,进行细致全面的...

ava.lang.nullpointerexception
答:怎么处理ava.lang.NullPointerEx... 1 2013-09-20 我编写完一个android程序,在编译时出现ava.lang... 2009-05-20 java.lang.nullpointerexception... 2018-05-23 java JDBC连接数据库 java.lang.NullP... 22 2013-04-12 exception java.lang.NullPointe... 8 2012-12-03 求助啊!总是显示ava....

零基础如何学习Java?
答:二.作为-个Java初学者,应该怎么学Java ?我给出的ava学习路线是这样的: JavaSE/数据库/Jdbc/前端基础/Javaweb/Spring/Mybatis/Maven/Springboot/Reids/Springcloud/Linux/Git.JavaSE:java基础,既然是基础,那肯定是最重要的,所以学习的时候也是需要重点学习的地方。数据库:为什么要学数据库呢,因为我们的...