我正在尝试压缩一个对象数组,这些对象将包含散布完整项目的空项目。我希望将所有完整元素放在开头的顺序与它们开始时的顺序相同,最后的空元素。
有问题的对象使用String字段“name”和int字段“weight”。空版本分别具有“无名称”和0。因此,方法需要处理的类型数组将包含:
在通过该方法进行馈送后,阵列应该是Fred,Bob,Gina,Yuki,没有名字,没有名字。
我对第一步的想法是弄清楚哪些是满的,哪些不是,所以我提出了这个:
public void consolidate() {
boolean[] fullSlots = new boolean[spaces.length];
// pass 1: find empties
for (int i = 0; i < spaces.length; i++) {
fullSlots[i] = spaces[i].getName().equals("no name");
}
}
spaces是对象数组,getName()从对象中检索name字段。
我不知道从哪里开始。建议?
编辑:好的,这是Infested提出的:
public void consolidate()
{
int numberOfEmpties = 0, spacesLength = spaces.length;
Chicken[] spaces2 = new Chicken[spacesLength];
for(int i = 0; i < spaces.length; i++)
{
spaces2[i] = new Chicken(spaces[i].getName(),
spaces[i].getWeight());
}
// pass 1: find empties
for (int i = 0, j = 0; i < spacesLength; i++)
{
if (spaces2[i].getName().equals("no name") == false)
{
spaces[j] = new Chicken(spaces2[i].getName(),
spaces2[i].getWeight());
j++;
}
else
{
numberOfEmpties++;
}
}
for (int i = spacesLength - 1; numberOfEmpties > 0 ; numberOfEmpties--, i--)
{
spaces[i] = new Chicken("no name", 0);
}
}
经过测试和工作。
答案 0 :(得分:1)
Java的Arrays.sort
稳定,这意味着相等元素的相对顺序不会改变。
这种保证是稳定的:相同的元素不会因排序而重新排序。
您可以使用排序算法的此属性,使用简单的比较器对所有元素进行排序:
Arrays.sort(
spaces
, new Comparator() {
public int compare(Object o1, Object o2) {
MyClass a = (MyClass)o1;
MyClass b = (MyClass)o2;
boolean aIsEmpty = "no name".equals(a.getName());
boolean bIsEmpty = "no name".equals(b.getName());
if (aIsEmpty && !bIsEmpty) {
return 1;
}
if (!aIsEmpty && bIsEmpty) {
return -1;
}
return 0;
}
}
);
这将在具有空名称的项目之前对具有非空名称的所有项目进行排序,从而使两个对象组的相对顺序在其各自的组中保持不变。
如果您的空间限制允许您创建MyClass
的新数组,则可以使用更简单的算法:遍历原始数组一次,并计算非空项。然后创建一个新数组,并创建两个索引:idxNonEmpty = 0
和idxEmpty = NonEmptyCount+1
。然后再次遍历原始数组,将非空对象写入idxNonEmpty++
,将空对象写入idxEmpty++
。
答案 1 :(得分:0)
我假设它是一个类的方法:
public void consolidate()
{
int lengthOfSpaces = spaces.length , i, numberOfEmpties = 0;
Type[] spacesNumberTwo = new Type[lengthOfSpaces ];
// pass 1: find empties
for (i = 0; i < lengthOfSpaces ; i++)
{
if(spaces[i].getName().equals("no name") == false)
spacesNumberTwo[i] = new Type(spaces[i].getName(), spaces[i].getInt());
else
numberOfEmpties++;
}
for (i = lengthOfSpaces - 1; numberOfEmpties > 0 ; numberOfEmpties--, i--)
{
spacesNumberTwo[i] = new Type("no name", 0);
}
spaces = spacesNumberTwo
}