所以我试图通过一个具有一定强度值的物体的arraylist,根据它们的强度值,它们会根据它进入更大的2D阵列。因此,如果它们的强度值为0,那么它们会进入较大值的第0个数组,这就是我的代码到目前为止的样子
private ArrayList<Battleable> arr;
public BattleDeck() {
arr = new ArrayList<Battleable>();
for (Battleable creature: arr){
arr.add(creature);
}
}
public Battleable[][] export2Darray() {
//returns a two-dimensional ragged array where each row
// contains a deep copy of all of the Battleable objects
// in the BattleStack with the corresponding Level value
Battleable[][] retVal = new Battleable[10][];
int k = 0;
for (int i = 0; i<arr.size(); i++){
int levelOfObj = arr.get(i).getLevel();
if(levelOfObj == k) {
//insert it into retVal[0][0]
}
}
}
return retVal;
}
我想知道我会怎么做?我如何语法上说&#34;得到强度为0的obj并将其置于我的2d数组的0 0位置
答案 0 :(得分:1)
这里是使用ArrayLists
的解决方案,我正在创建一个ArrayList
,它将被强度引用,然后在其中我有另一个ArrayList
将拥有所有的Battleable
具有该强度等级的物体。
public ArrayList<ArrayList<Battleable>> exportBattleable() {
ArrayList<ArrayList<Battleable>> retVal = new ArrayList<ArrayList<Battleable>>();
for (int i = 0; i < arr.size(); i++){
retVal.get(arr.getLevel()).add(arr.get(i));
}
return retVal;
}
现在,如果您要打印Battleable
的所有strength = 3
个对象,您可以这样做:
ArrayList<Battleable> strength3 = retVal.get(3);
for(Battleable battleable : strength3) {
System.out.println(battleable.toString());
}
这样您就不必担心重新调整数组大小,具体取决于您添加的Battleable
个对象数量,与强度级别相同,如果您决定使用0-9
您想要使用0-20
,您已经具备了向上或向下扩展的能力。
答案 1 :(得分:1)
使用Java 8流的解决方案:
// group Battleables ArrayList by strength
Map<Integer, List<Battleable>> map =
arr.stream().collect(Collectors.groupingBy(Battleable::getStrength));
结果是Map
包含作为列表的Battleables作为其关键点。
如果您需要将结果作为锯齿状2D数组,请按以下方式对条目进行排序:
final Battleable[][] arrays = new Battleable[10][];
map.entrySet().forEach(entry -> {
arrays[entry.getKey()] = entry.getValue().toArray(new Battleable[entry.getValue().size()]);
});
答案 2 :(得分:1)
由于数组在Java中具有固定大小,因此没有干净的方法将项添加到数组中。您每次都可以通过每次创建一个新数组(一个大于最后一个数组)并将数据从旧数组复制到新数组来调整数组大小,但这样会很麻烦,您将重新发明名为{{1的轮子}}。 Modus Tollens有一个很好的答案,但它使用了一些稍微高级的Java 8概念。这是没有它们的一种方法:
ArrayList