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