我试图更好地理解排序,并且我遇到了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;
}
}
答案 0 :(得分:3)
有两种简单的解决方案:
正如Mureinik所建议的那样,你可以创建一个更小的数组。
person[] persons = new person[5];
您还提到要从数组中删除索引,但在技术上您无法在Java
中执行此操作。您可以null
值,但实际上无法删除索引。如果这是您想要的长期功能,要动态处理数组大小,那么您应该使用ArrayList
或List
对象。
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();