将数组拆分为2个较小的80%和20%原始数组?

时间:2018-04-23 13:48:43

标签: java

我有一个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);

4 个答案:

答案 0 :(得分:1)

尝试

int size = array.length;;
int trainingSize = (int)(size * 0.8);
int testingSize = size - trainingSize;

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

答案 1 :(得分:0)

size/100是一个整数。 因此,您需要将分部更改为浮动分区。你可以通过使其中一个因素平坦来实现这一点。

float trainingSize = size/100.0f;

答案 2 :(得分: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]

答案 3 :(得分:0)

到欧内斯特的观点

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

    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);