JAVA实现数据等分,一个List分成多个List

  • 将一组数据平均分成n组

/**
 * 将一组数据平均分成n组
 *
 * @param source 要分组的数据源
 * @param n      平均分成n组
 * @param <T>
 * @return
 */
public static <T> List<List<T>> averageAssign(List<T> source, int n) {
    List<List<T>> result = new ArrayList<List<T>>();
    int remainder = source.size() % n;  //(先计算出余数)
    int number = source.size() / n;  //然后是商
    int offset = 0;//偏移量
    for (int i = 0; i < n; i++) {
        List<T> value = null;
        if (remainder > 0) {
            value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
            remainder--;
            offset++;
        } else {
            value = source.subList(i * number + offset, (i + 1) * number + offset);
        }
        result.add(value);
    }
    return result;
}
  •  将一组数据固定分组,每组n个元素

/**
 * 将一组数据固定分组,每组n个元素
 * @param source 要分组的数据源
 * @param n      每组n个元素
 * @param <T>
 * @return
 */
public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {

    if (null == source || source.size() == 0 || n <= 0)
        return null;
    List<List<T>> result = new ArrayList<List<T>>();

    int sourceSize = source.size();
    int size = (source.size() / n) + 1;
    for (int i = 0; i < size; i++) {
        List<T> subset = new ArrayList<T>();
        for (int j = i * n; j < (i + 1) * n; j++) {
            if (j < sourceSize) {
                subset.add(source.get(j));
            }
        }
        result.add(subset);
    }
    return result;
}
  • 将一组数据固定分组,每组n个元素

 

/**
 * 将一组数据固定分组,每组n个元素
 *
 * @param source 要分组的数据源
 * @param n      每组n个元素
 * @param <T>
 * @return
 */
public static <T> List<List<T>> fixedGrouping2(List<T> source, int n) {

    if (null == source || source.size() == 0 || n <= 0)
        return null;
    List<List<T>> result = new ArrayList<List<T>>();
    int remainder = source.size() % n;
    int size = (source.size() / n);
    for (int i = 0; i < size; i++) {
        List<T> subset = null;
        subset = source.subList(i * n, (i + 1) * n);
        result.add(subset);
    }
    if (remainder > 0) {
        List<T> subset = null;
        subset = source.subList(size * n, size * n + remainder);
        result.add(subset);
    }
    return result;
}
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要对多列数据进行 k-匿名化,可以使用以下步骤: 1. 将要匿名化的数据集按照敏感属性进行分类,每个分类称为一个“组”(group)。 2. 对于每个组,按照非敏感属性进行划分,每个划分称为一个“等价类”(equivalence class)。 3. 对于每个等价类,计算其中所有记录的敏感属性的频率分布,并确定其中最小的频率。 4. 对于每个等价类,如果其中的记录数小于 k,那么就需要将该等价类与其他等价类合并,直到每个等价类中的记录数都不小于 k。 5. 对于每个等价类,随机选择 k 条记录进行保留,其余记录进行匿名化处理。匿名化处理的方法可以是将敏感属性值替换成对应的频率最小值,或者是将敏感属性值进行随机扰动等。 以下是一个简单的 Java 实现示例,假设数据集包含三列数据,分别为姓名、性别和年龄,其中性别和年龄为敏感属性,需要进行 k-匿名化处理: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class KAnonymity { private static final int k = 2; // 设置 k 值为 2 private static final Random random = new Random(); public static void main(String[] args) { // 假设数据集包含三列数据:姓名、性别和年龄 List<String[]> dataset = new ArrayList<>(); dataset.add(new String[]{"张三", "男", "20"}); dataset.add(new String[]{"李四", "女", "25"}); dataset.add(new String[]{"王五", "男", "30"}); dataset.add(new String[]{"赵六", "女", "35"}); // 将数据集按照性别进行分类,每个分类称为一个“组” Map<String, List<String[]>> groups = new HashMap<>(); for (String[] record : dataset) { String gender = record[1]; if (!groups.containsKey(gender)) { groups.put(gender, new ArrayList<>()); } groups.get(gender).add(record); } // 对于每个组,按照年龄进行划分,每个划分称为一个“等价类” for (List<String[]> group : groups.values()) { Map<String, List<String[]>> equivalenceClasses = new HashMap<>(); for (String[] record : group) { String age = record[2]; if (!equivalenceClasses.containsKey(age)) { equivalenceClasses.put(age, new ArrayList<>()); } equivalenceClasses.get(age).add(record); } // 对于每个等价类,计算其中所有记录的敏感属性的频率分布,并确定其中最小的频率 for (List<String[]> equivalenceClass : equivalenceClasses.values()) { Map<String, Integer> frequencyDistribution = new HashMap<>(); for (String[] record : equivalenceClass) { String sensitiveValue = record[1] + "," + record[2]; frequencyDistribution.put(sensitiveValue, frequencyDistribution.getOrDefault(sensitiveValue, 0) + 1); } int minFrequency = Integer.MAX_VALUE; for (int frequency : frequencyDistribution.values()) { if (frequency < minFrequency) { minFrequency = frequency; } } // 对于每个等价类,如果其中的记录数小于 k,那么就需要将该等价类与其他等价类合并,直到每个等价类中的记录数都不小于 k if (equivalenceClass.size() < k) { while (equivalenceClass.size() < k) { for (List<String[]> otherEquivalenceClass : equivalenceClasses.values()) { if (otherEquivalenceClass != equivalenceClass && otherEquivalenceClass.size() > k) { String[] recordToMerge = otherEquivalenceClass.remove(random.nextInt(otherEquivalenceClass.size())); equivalenceClass.add(recordToMerge); if (equivalenceClass.size() == k) { break; } } } } } // 对于每个等价类,随机选择 k 条记录进行保留,其余记录进行匿名化处理 for (String[] record : equivalenceClass) { String sensitiveValue = record[1] + "," + record[2]; if (frequencyDistribution.get(sensitiveValue) == minFrequency) { System.out.println(record[0] + "," + sensitiveValue); } else { String[] anonymousRecord = new String[]{ record[0], "anonymous", String.valueOf(random.nextInt(100)) }; System.out.println(anonymousRecord[0] + "," + anonymousRecord[1] + "," + anonymousRecord[2]); } } } } } } ``` 在这个示例中,我们将 k 值设置为 2,即每个等价类至少包含两条记录。首先按照性别将数据分成两个组,然后对于每个组按照年龄进行划分,得到若干个等价类。然后对于每个等价类,计算其中所有记录的敏感属性的频率分布,并确定其中最小的频率。如果等价类中的记录数小于 k,就需要将该等价类与其他等价类合并,直到每个等价类中的记录数都不小于 k。最后对于每个等价类,随机选择 k 条记录进行保留,其余记录进行匿名化处理。如果一个记录的敏感属性值在其等价类中的频率等于最小频率,就保留该记录,否则就进行匿名化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值