将一个数组分成两个较小的数组,分别占原始数组的80%和20%的大小?

4
我有一个长度为X的数组,想把它分成两个更小的数组。一个数组长度是原始数组长度的80%,另一个数组长度是原始数组长度的20%。
例如,长度为10的数组将分成两个长度为8和2的较小数组。
我有下面的代码,我认为应该可以工作,但当我使用长度为7的数组运行代码时,trainingSize变量被设置为0.0,因此testingSet变量被设置为7.0。这是为什么?这只是控制台的错误,而不是实际代码的错误吗?
        int size = array.length;
        float trainingSize = (float) (size/100);
        System.out.println(size/100);
        float testingSize = size - trainingSize;

        System.out.println("\nSize: " + size);
        System.out.println("Training set size: " + trainingSize);
        System.out.println("Testing set size: " + testingSize);

1
你可以使用整数除法来获取整个索引号。但是,你不应该为训练/测试获取随机拆分吗? - ernest_k
1
你不需要执行浮点数训练大小 = 大小 * 80.0f / 100.0f;吗? - Akhadra
4个回答

2
尝试一下。
int size = array.length;;
int trainingSize = (int)(size * 0.8);
int testingSize = size - trainingSize;

首先,80%的乘数应该是0.8。对于数组索引,最好将其强制转换为整数。


0

size/100 是一个整数。因此,您需要将除法更改为浮点除法。您可以通过将其中一个因子变成浮点数来实现。

float trainingSize = size/100.0f;

0
你需要类似这样的东西:
    int size = array.length;
    float percent = 80.0f;
    int trainingSize = (int)(size * (percent / 100));// size = 5
    int testingSize = size - trainingSize;           // size = 2 

使用Java 10的完整示例

    var array = new Integer[] { 1, 2, 3, 4, 5, 6, 7 };
    var size = array.length;
    var percent = 80.0f;
    var trainingSize = (int) (size * (percent / 100));// size = 5
    //var testingSize = size - trainingSize;           // size = 2 (No need to)

    var array1 = Stream.iterate(0, i -> i < trainingSize, i -> i + 1).map(i -> array[i])
            .toArray(Integer[]::new);

    var array2 = Stream.iterate(trainingSize, i -> i < size, i -> i + 1).map(i -> array[i])
            .toArray(Integer[]::new);

    System.out.println(Arrays.toString(array1));
    System.out.println(Arrays.toString(array2));

输出

[1, 2, 3, 4, 5]
[6, 7]

如果您只想拆分列表,可以使用List<>.subList()并计算索引,为什么要使用流和映射。 - mavriksc
@mavriksc 我只是想学习一下Java 10的新特性而已 :) - Youcef LAIDANI

0

回应Ernest的观点

编辑 这实际上更有效...只随机提取测试数据

    List<Object> things = new ArrayList<>();
    List<Object> test = new ArrayList<>();
    List<Object> train = new ArrayList<>();
    int sampSize = things.size() / 5;
    for (int i = 0; i < sampSize; i++) {
        test.add(things.remove(ThreadLocalRandom.current().nextInt(things.size())));
    }
    train.addAll(things);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接