Java 数组分组算法实现

本贴最后更新于 2413 天前,其中的信息可能已经时移俗易

需求:对一个数组按顺序进行分组

起因:
今天领导突然来了个需求,需要发送 2000 多条短信,但是第三方接口只能一次调用 200 条短信,情况紧急,但是我又不想一个个的弄,于是想能不能分组进行发送,在百度上搜了半天,看到的方法也很多,
但也很复杂,终于决定还是自己写一个吧 😥
实现过程:

首先设定两个变量
1.需要分组的数组 String[] elements
2.每个组的元素的数量 int gc
这样就可以计算总共的组数 count = elements.length/gc
count 有两种情况
一种能被整除为 count
不能被整除为 count+1

代码:

private static List<String[]> groupBySequence(int gc, String[] elements){
List<String[]> list = new ArrayList<>();
int count = elements.length/gc;
int mod = elements.length%gc;
if (mod != 0) count++;
for (int i = 0;i<count;i++){
    String[] arr;
    if (i == (count-1)){
        if (mod != 0){
            int temp = 0;
            arr = new String[mod];
            for (int j = i*gc; j<(i*gc)+mod;j++){
                arr[temp] = elements[j];
                temp++;
            }
        } else {
            int temp = 0;
            arr = new String[gc];
            for (int j=i*gc;j<gc*(i+1);j++){
                arr[temp] = elements[j];
                temp++;
            }
        }
    } else {
        int temp = 0;
        arr = new String[gc];
        for (int j=i*gc;j<gc*(i+1);j++){
            arr[temp] = elements[j];
            temp++;
        }
    }
    list.add(arr);
}
return list;
}

调用方法:

public static void main(String[] args) {
String[] arrays = {"杨过","小龙女","令狐冲","任盈盈","郭靖","黄蓉","张无忌","赵敏","段誉","王语嫣","鸠摩智"};
int gc = 2;
List list = ArraysUtils.groupBySequence(gc, arrays);
System.out.println(JSONObject.toJSONString(list));

}

运行结果

[["杨过","小龙女"],["令狐冲","任盈盈"],["郭靖","黄蓉"],["张无忌","赵敏"],["段誉","王语嫣"],["鸠摩智"]]

情况紧急所以写的很随意,过几天再回来优化 ☺️

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • count
    2 引用 • 4 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • washmore 1

    骚年,你或许可以这样做:

    String[] names = new String[]{"zhangsan", "lisi", "wangwu", "zhaoliu", "tianqi", "wangba", "jiuyue", "shiquan"};
    List result = Arrays.stream(names).collect(Collectors.groupingBy(x -> Arrays.asList(names).indexOf(x) / 3)).values().stream().collect(Collectors.toList());
    System.out.println(result);
    
    //out :[[zhangsan, lisi, wangwu], [zhaoliu, tianqi, wangba], [jiuyue, shiquan]]
    

    当然 对 List 参数也适用:

    List names = new ArrayList() {{
        add("zhangsan");
        add("lisi");
        add("wangwu");
        add("zhaoliu");
        add("tianqi");
        add("wangba");
        add("jiuyue");
        add("shiquan");
    }};
    List result =names.stream().collect(Collectors.groupingBy(x -> names.indexOf(x) / 3)).values().stream().collect(Collectors.toList());
    System.out.println(result);
    
    //out :[[zhangsan, lisi, wangwu], [zhaoliu, tianqi, wangba], [jiuyue, shiquan]]
    

    当然,骚年你或许还可以尝试下这个小玩意
    非侵入代码的 java 自动分批提交数据组件
    刚好使用你这个场景,暂不支持 String[]数组类型,不过你只需要使用下 Arrays.as() 转换一下成 List 就行了;

    1 回复
  • 其他回帖
  • 鸠摩智 一个人单着

  • yjq14114
    作者

    学习了

  • wenandlu

    鸠摩智好可怜