修剪一个对象数组

时间:2016-08-09 21:56:08

标签: java arrays sorting

我试图更好地理解排序,并且我遇到了java.lang.NullPointerException的问题我知道它是因为数组中的空值。所以我的问题是,是否有一种简单的方法来删除那些空值或修剪数组,以便不会出现错误?任何反馈都将非常感激

public class main {

public static void main(String[] args){
      person[] persons = new person[6];
    persons[0]=new person("bill nye",34);
    persons[1]=new person("frank white",64);
    persons[2]=new person("sara poppa ",20);
    persons[3]=new person("jess stoor",28);
    persons[4]=new person("mike amato",20);




    for(int i=0;i<persons.length;i++){ //before sorting
    System.out.println(persons[i]);
    }

    insertionSort(persons);
    System.out.println();

    for(int i=0;i<persons.length;i++){ //before sorting
        System.out.println(persons[i]);
    }

}
     public static void insertionSort(person[] persons) {
            int in, out;

            for (out = 1; out < persons.length; out++) {
              person temp = persons[out];
              in = out;

              while (in > 0 && persons[in - 1].getName().compareTo(temp.getName()) > 0) {
                  persons[in] = persons[in - 1];
                  --in;
                }
                persons[in] = temp;
              }
            }

}

public class person {
private String Name;
private int Age;
public person(String name, int age){

this.Name=name;
this.Age=age;


}   
    public String getName(){
    return Name;    
    }
    public void setName(String name) {
        Name = name;
    }




    public int getAge() {
        return Age;
    }
    public void setAge(int age) {
        Age = age;
    }


    public String toString(){

        return Name + " " + Age;
    }

}

6 个答案:

答案 0 :(得分:3)

有两种简单的解决方案:

正如Mureinik所建议的那样,你可以创建一个更小的数组。

person[] persons = new person[5];

您还提到要从数组中删除索引,但在技术上您无法在Java中执行此操作。您可以null值,但实际上无法删除索引。如果这是您想要的长期功能,要动态处理数组大小,那么您应该使用ArrayListList对象。

ArrayList<person> persons = new ArrayList<>();
persons.add(object);

如果你需要删除一个对象:

persons.remove(index);

答案 1 :(得分:3)

您应该尽量减小数组的大小以避免这些错误。 或者只使用ArrayList<person>,这样可以完全消除这些错误,同时对性能产生相对较小的影响。

List<person> persons = new ArrayList<person>();
persons.add(new person("John Smith", 42));
persons.add(new person("Jane Smith", 31));

如果您仍想使用数组,可以使用以下选项:

简单的方法是计算非null对象并将它们复制到一个新数组中:

int nonNullCount = 0;
for (person p : persons)
    if (p != null)
        nonNullCount++;
person[] nonNullPersons = new person[nonNullCount];
int i = 0;
for (person p : persons)
    if (p != null)
        nonNullPersons[i++] = p;

或者您可以使用Java 8流来过滤所有非空对象:

person[] nonNullPersons = Arrays.stream(persons)
            .filter(p -> p != null) //only keep non-null persons
            .toArray(person[]::new); //create new array of persons

答案 2 :(得分:2)

不确定

您可以这样做:

private <T> T[] removeNullElements(T[] array) {
  array = Arrays.copyOf(array, array.length);

  int i = 0;
  for(int j = 0; j < array.length; j++) {
    if(array[j] != null) {
      array[i++] = array[j];
    }
  }

  return Arrays.copyOfRange(array, 0, i);
}

这将遍历您的数组,并将跳过每个null元素。

效率不高,几年前我从一些代码中删除它 - 但它确实有效。

答案 3 :(得分:0)

您可以使用数组初始值设定语法,在不使用List的情况下使用适当数量的元素创建数组,而无需对元素数进行硬编码:

person[] persons = new person[] {
    new person("bill nye",34),
    new person("frank white",64),
    new person("sara poppa ",20),
    new person("jess stoor",28),
    new person("mike amato",20)
};

答案 4 :(得分:0)

您可以使用值初始化数组。

person[] persons = { new person("bill nye",34), new person("frank white",64),
                     new person("sara poppa ",20), new person("jess stoor",28),
                     new person("mike amato",20) };

或者我建议您使用ArrayList并将对象添加到其中。

ArrayList<person> persons = new ArrayList();
persons.add(new person("bill nye",34));
persons.add(new person("frank white",64));
persons.add(new person("sara poppa ",20));
persons.add(new person("jess stoor",28));
persons.add(new person("mike amato",20));

答案 5 :(得分:0)

有一个名为Arrays.stream的java8新功能,使用lambda表达式可以实现它。

Arrays.stream(arr).filter(v -> v != 0).toArray();