1

我正在尝试压缩一个对象数组,这些对象将有空项目穿插完整项目。我想把所有的完整元素按照它们开始的顺序放在开头,然后把空元素放在最后。

有问题的对象使用一个字符串字段“name”和一个 int 字段“weight”。空版本分别具有“无名”和 0。因此,该方法需要处理的类型的数组将包含以下内容:

  • 弗雷德 | 4
  • 鲍勃 | 3
  • 没有名字 | 0
  • 吉娜 | 9
  • 没有名字 | 0
  • 由纪 | 7

通过方法喂完后,数组应该是 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");
    }
}

空格是对象数组,getName() 从对象中检索名称字段。

我不知道从这里去哪里。建议?

编辑:好的,这就是 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);
    }
}

测试和工作。

4

2 回答 2

1

JavaArrays.sortstable,这意味着相等元素的相对顺序不会改变。

这种排序保证是稳定的:相同的元素不会因为排序而重新排序。

您可以使用排序算法的此属性通过简单的比较器对所有元素进行排序:

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 = 0idxEmpty = NonEmptyCount+1。然后再次遍历原始数组,将非空对象写入idxNonEmpty++,并将空对象写入idxEmpty++

于 2013-02-20T21:37:18.027 回答
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
}
于 2013-02-20T21:44:55.367 回答