簡體   English   中英

從數組中刪除對象(Java)

[英]Removing objects from an array(Java)

我有一個所有者類,其中包含一系列擁有的狗。 它看起來像這樣:

public class Owner {
    
    private String ownerName;
    public Dog[] ownedDogs = new Dog[0];
    private int dogCount = -1;
    
    public Owner(String ownerName) {
        this.ownerName = ownerName;
    }
    
    public String getName(){
        return ownerName;
    }
    
    public void assignDog(Dog d) {
        
        Dog[] newOwnedDogs = new Dog[ownedDogs.length + 1];
        for (int i = 0; i < ownedDogs.length; i++) {
            newOwnedDogs[i] = ownedDogs[i];
        }
        ownedDogs = newOwnedDogs;
        
        this.ownedDogs[++dogCount] = d;
        makeOwner(this, d);
    }

   
   private void makeOwner(Owner o, Dog d) { 
        
        if(d.owner !=o) {
            d.owner = o;
        }
    }
    
    public boolean ownerOfDog(Dog d){
        if (d.getOwner() == this){
            return true;
        } else {
            return false;
        }
         
    }
    
    public String toString(){
        return "Name: " + ownerName;
    }

狗類看起來像這樣:

public class Dog{
    private String name;
    private String breed;
    private int age;
    private int weight;
    private double tailLength;
    public Owner owner;
    

    public Dog(String name, String breed, int age, int weight) {
            this.name = name;
            this.breed = breed;
            this.age = age;
            this.weight = weight;
            
    }
   
    public String getName() {
        return name;
    }
    
    public String getBreed() {
        return breed;
    }
    
    public void increaseAge() {
        age++;
    }

    public int getAge() {
        return age;
    }

    public int getWeight() {
        return weight;
    }

    public double getTailLength() {
        if (breed.equalsIgnoreCase("dachshund") || breed.equalsIgnoreCase("tax")) {
            return 3.7;
        } else {
            return weight * (age / 10.0);
        }
    }
    
    public Owner getOwner(){
        return owner;
    }
    
    public void setOwner(Owner o) {
        if(this.owner != o) {
            this.owner = o;
            o.assignDog(this);
        }
    }
    
    public String toString() {
        return "Name: " + name + " Breed: " + breed + " Age: " + age + " Weight: " + weight + " Tail length: " + getTailLength() + " owned by: " + owner;
    }
}

我正在嘗試創建一種從數組中刪除狗的方法,這就是我目前擁有的:

public void removeDog () {
        
        System.out.println("Enter the name of the dog?> ");
        String name = input.nextLine();
        
        Owner o = findOwner(name);
        Dog d = findDog(name);
        
        if(d == null) {
            System.out.println("Error: no such dog");
            
        } else {

            //Code to remove dog from o.ownedDogs
            
        }
            System.out.println(name + " is removed from the register");
    }

有沒有一種不用手動輸入元素索引就可以從數組中刪除對象的好方法? 我看過使用其他數據類型的示例,但我是 Java 的初學者,所以在這里應用它時遇到了麻煩。

使用數組的問題是刪除一個實際上並不重要的對象,因為您必須:

  1. 創建一個大小比當前數組小 1 的新數組
  2. 查找實例的索引
  3. 如果沒有找到,停止
  4. 將所有元素從舊數組復制到新數組直到索引
  5. 將索引后的所有元素從舊的向上數組復制到新的向上數組
  6. 在您的實例中為新陣列換出舊陣列

與以下內容相比,這一切都“太難了”:

public List<Dog> ownedDogs = new ArrayList<>();

然后

ownedDogs.remove(d);

您需要在Dog類中實現equals() (和hashCode() )。

作為一般規則,當您可以使用集合時,永遠不要使用數組。


您可能應該使用Set<Dog> ownedDogs = new HashSet<>(); 並將ownedDogs私有並為其提供吸氣劑。

從功能的角度來看,假設在你的例子中,狗的名字是一個唯一的標識符,你將通過過濾初始數組來生成一個新數組:

ownedDogs = Arrays.stream(ownedDogs)
.filter(dog -> !dog.name.equals(nameToRemove))
.toArray();

Arrylists 會解決這個問題,它可以像這樣實現

public ArrayList<Dog> ownedDogs=new ArrayList<>();

並使用

ownedDogs.remove(index);

與常規數組不同,它們沒有定義的大小,一旦你從它們中刪除一個對象,索引就會相應地發生變化

如果要從數組中刪除元素,則不應使用數組。 相反,ArrayList 可能適合您的需求,因為您可以非常輕松地添加和刪除狗。

鑒於您使用 ArrayList,這里有一種方法可以從所述列表中刪除一只狗:

for (int i = 0; i < ownedDogs.size(); i++){
   if(d == ownedDogs.get(i)){
      ownedDogs.remove(i);
      break;
   }
}

要么:

ownedDogs.remove(d)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM