当前位置: 首页 > 知识库问答 >
问题:

基于子列表重新排列Java列表

吕志诚
2023-03-14
public static Map<String, Map<String, Integer>> partition(List<Integer> list, int gridSize) {
        int size = list.size() - 1;
        int targetSize = size / gridSize + 1;

        Map<String, Map<String, Integer>> result = new HashMap<String, Map<String, Integer>>();
        int number = 0;
        int start = 0;
        int end = start + targetSize - 1;

        while (start <= size) {
            Map<String, Integer> value = new HashMap<String, Integer>();
            result.put("partition" + number, value);

            if (end >= size ) {
                end = size;
            }
            value.put("startIndex", ids.get(start));
            value.put("endIndex", ids.get(end));
            start += targetSize;
            end += targetSize;
            number++;
        }
        
        return result;
    }
partition0={startIndex=1, endIndex=9}, partition1={startIndex=10, endIndex=18}, partition2={startIndex=19, endIndex=27}, partition3={startIndex=28, endIndex=36}, partition4={startIndex=37, endIndex=45}, partition5={startIndex=46, endIndex=54}, partition6={startIndex=55, endIndex=63}, partition7={startIndex=64, endIndex=72}, partition8={startIndex=73, endIndex=81}, partition9={startIndex=82, endIndex=90}, partition10={startIndex=91, endIndex=99}, partition11={startIndex=100, endIndex=100}}
{partition0={startIndex=1, endIndex=9}, partition1={startIndex=10, endIndex=18}, partition2={startIndex=19, endIndex=27}, partition3={startIndex=28, endIndex=36}, partition4={startIndex=37, endIndex=45}, partition5={startIndex=46, endIndex=54}, partition6={startIndex=55, endIndex=63}, partition7={startIndex=64, endIndex=72}, partition8={startIndex=73, endIndex=81}, partition9={startIndex=82, endIndex=90}, partition10={startIndex=91, endIndex=99}, partition11={startIndex=100, endIndex=100}
[1, 2, 3, ..... ,98, 99, 100]
[3, 4, 5, 6, 7, 11, 12, 14, 15, 16, 17, 21, 26, 28, 33, 38, 42, 67, 74, 82, 84, 91, 92]

在上面的示例中,子集列表有23个元素。对于gridSize为12,子集列表中的23个元素应该分布在12个分区中,因此在这种情况下,每个分区应该有2个子集列表中的元素。

这个问题与spring批处理分区有关。列表中的整数实际上是spring批处理程序要处理的用户ID。有些用户比其他用户需要更多的处理时间。因此在分区过程中可能发生的情况是,某些分区可能包含比其他分区占用更多处理时间的更多用户。这会导致某些分区/线程在其他分区之前完成并未使用,从而延迟作业的完成。子集列表是需要更多处理时间的用户列表。我希望跨分区统一分配这样的用户。

共有1个答案

张敏达
2023-03-14

我假设您不能更改分区函数,只能更改输入列表顺序。如果情况并非如此,还有更好的解决方案。我还假设列表中没有重复项。

如果子集超过所有值的一半,则此解决方案将不起作用。

//list_all = Arrays.asList(1, 2, ..., 100)
//list_sub = Arrays.asList(4, 6, 55)

public static List<Integer> reorder(List<Integer> all, List<Integer> sub) {
  all.removeAll(sub);
  int every = all.size() / sub.size();
  List<Integer> result = new ArrayList();
  Iterator<Integer> sub_it = sub.iterator();
  for(int i=0; i<all.size(); i++) {
     result.add(all.get(i));
     if(i%every == 0 && sub_it.hasNext())
       result.add(sub_it.next());
  }

  while(sub_it.hasNext())
    result.add(sub_it.next());
  
  return result;
}

抱歉代码有任何错误,我写得很匆忙。

 类似资料:
  • 问题内容: 如何使用Collections.sort()或其他排序方法按字典顺序对Java中的列表列表进行排序? 问题答案: 您将必须实现自己的类并将实例传递给 然后分类很容易

  • 创建一个Java方法,它将列表作为参数(MasterList)并返回另一个列表(ExpectedList)。 列表中每个对象都有两个变量: null 我试图实现的逻辑是:当有多个ID相同的对象时,只考虑计数较大的特定对象。表示ID:有3个对象,所以我只考虑(ID:abc122,Count:20),因为在ID:abc122的对象中Count更高。在结束时,方法应返回

  • 问题内容: 我确信这个问题以前可能已经被问过,但我似乎找不到正确的答案。如果我有两个清单 我正在尝试使用_list1重新排列_list2中的元素,以便它们完全匹配顺序。什么是最干净的方法?所需的输出: 很抱歉,如果这是重复的,但到目前为止,我只能使用压缩的sorted()方法找到数字列表的答案。 如果_list2是列表列表怎么办? 所需输出: 还有一个假设:如果我想使用_list1作为键对其他任何

  • 问题内容: 如果我有列表,如何以任意方式重新排序商品? 编辑:我不想洗牌。我想以预定义的方式对它们进行重新排序。(例如,我知道旧列表中的第3个元素应成为新列表中的第一个元素) 问题答案: 你可以这样

  • 我有一个超过200列的。问题在于订单生成时的状态 我需要按如下方式重新排列这些列: 在Python中有什么方法可以做到这一点吗?

  • 问题内容: 我有一个数据库SQLite,然后使用SimpleCursorAdapter,将值显示到列表视图中。但是,我想重新排列列表视图项,并在顶部显示ID#1,然后显示ID号2,依此类推。问题是,我无法掌握根据以下内容重新分配列表视图项的概念在内容提供商提供的某些ID号上。如果您知道,请分享。谢谢。 问题答案: 如果正确使用SQLite,则在查询数据库时应该能够执行“按ID排序”。 如果不是这种