有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:按完整与否对1d对象数组进行排序

我试图压缩一个对象数组,其中有空项和完整项。我想把所有完整的元素放在开头,按照它们开始的顺序,把空元素放在结尾

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

  • 弗雷德| 4
  • 鲍勃| 3
  • 没有名字| 0
  • 吉娜| 9
  • 没有名字| 0
  • Yuki | 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()从对象中检索名称字段

我不知道接下来该怎么办。建议

编辑:好的,下面是《感染》杂志的报道:

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

测试和工作


共 (2) 个答案

  1. # 1 楼答案

    Java的Arrays.sort稳定的,这意味着相等元素的相对顺序不会改变

    This sort is guaranteed to be stable: equal elements will not be reordered as a result of the 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 = 0idxEmpty = NonEmptyCount+1。然后再次遍历原始数组,将非空对象写入idxNonEmpty++,将空对象写入idxEmpty++

  2. # 2 楼答案

    我假设这是一个类的方法:

    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
    }