2014-07-25 62 views
4

以下代碼不會給我正確的答案。indexOf()將找不到自定義對象類型

class Point { 

    int x; int y; 
    public Point(int a,int b){ 
     this.x=a;this.y=b; 
    } 
} 

class A{ 

    public static void main(String[] args){ 

     ArrayList<Point> p=new ArrayList<Point>(); 
     p.add(new Point(3,4)); 
     p.add(new Point(1,2)); 
     System.out.println(p.indexOf(1,2)); 

    } 
} 

這給出-1;

一般情況下,如果給出了點的數組列表,那麼我們怎樣才能找到數組中的一個特定點的索引?

+0

indexof是做什麼的?你使用java的point類還是你定義的類?你定義的一個沒有構造函數? –

+2

更具體地說,您是否閱讀過indexOf方法的JavaDoc?如果沒有,那應該是你的第一停靠港。整個Java API都有很好的文檔記錄。 – JonK

+0

indexOf需要一個'object',你需要傳入一個你正在尋找的'point'對象。 – Mister

回答

6

indexOf需要該對象作爲輸入。如果它沒有找到你傳入的對象,它將返回-1。您需要將位於您正在查找的ArrayList中的位置的對象作爲輸入傳遞給indexOf函數。在這種情況下,你也應該重寫hashcode和equals。

覆蓋哈希碼和等於你的班級點。然後,一旦您創建了此類Point的實例(使用new關鍵字)並將它們添加到arrayList,就可以使用任何Point對象作爲indexOf調用的參數對arrayList使用indexOf調用。

類別點

public class Point { 

     int x; 
     int y; 

     public Point(int a, int b) { 
     this.x=a;this.y=b; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + x; 
      result = prime * result + y; 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      Point other = (Point) obj; 
      if (x != other.x) 
       return false; 
      if (y != other.y) 
       return false; 
      return true; 
     }  
} 

類測試(你把它稱爲 「A」):

import java.util.ArrayList; 

public class Test { 

    public static void main(String[] args){ 

      ArrayList<Point> p=new ArrayList<Point>(); 

      Point p1 = new Point(3,4); 
      Point p2 = new Point(1,2); 

      p.add(new Point(3,4)); 
      p.add(new Point(1,2)); 

      System.out.println(p.indexOf(p1)); 
    } 

} 
2

您需要創建一個點傳遞到的indexOf方法。

p.indexOf(new Point(1,2)); 

但是,這種改變本身仍然會返回-1。見的indexOf的API文檔:

公衆詮釋的indexOf(對象o)

返回指定元素中第一次出現的索引此列表,或-1,如果此列表中不包含的元素。更正式地說,如果沒有這樣的索引,則返回最低索引i,使得(o == null?get(i)== null:o.equals(get(i)))或-1。

它使用等於決定它是否找到匹配。你沒有重寫你的point類的equals方法,所以它使用java.lang.Object中的默認實現,它比較了引用,並且只在兩個引用指向同一個對象時才返回true。

覆蓋equals和hashCode在你點類,如:

@Override public boolean equals(Object other) { 
    if (!(other instanceof point)) { 
     return false; 
    } 
    point otherPoint = (point)other; 
    return otherPoint.x == this.x && otherPoint.y == this.y; 
} 

@Override public int hashCode() { 
    return x + y; // same values should hash to the same number 
} 

和方式之類的兩種不同的情況下,可通過值進行比較。

0

我們如何找到數組中某個點的索引?

ArrayList<point> p=new ArrayList<point>(); 
point p1 = new point(3,4)); 
point p2 = new point(1,2)); 
p.add(p1); 
p.add(p2); 

System.out.println(p.indexOf(p1)); 

的參數indexOf()是一個對象。將它傳遞給你的一個點對象。

2

ArrayList.indexOf()不接受兩個整數作爲參數。您必須輸入一個對象,該對象應該是一個Point對象。

如果您仍然要撥打ArrayList.indexOf(int, int),那麼您必須創建ArrayList的子類,實施indexOf(int,int)

以下代碼應該爲您找到想要的對象。首先,您需要將覆蓋Object類中的Object類的等於方法,以便比較兩個點。

public class Point { 
    private int x; 
    private int y; 

    @Override 
    public boolean equals(Object anotherObject) { 
     if (!(anotherObject instanceof Point)) { 
      return false; 
     } 
     Point p = (Point) anotherObject; 
     return (this.x == p.x && this.y == p.y); 
    } 
} 

其次,你可以撥打indexOf(Object)

ArrayList<Point> p = new ArrayList<Point>(); 
// Create the point to find in the list. 
Point findMe = new Point(1,2); 
// Search the array and save the found index. 
int index = p.indexOf(findMe); 

PS:你應該遵循Java命名約定;類必須以大寫字母開頭。

+1

如果anotherObject爲null,則(anotherObject instanceof Point)將返回false,因此anotherObject == null的檢查是無用的。 – holap

+0

@holap你說得對。我已經刪除了空檢查。 –

+0

應該注意的是,如果你重寫'equals(Object)',那麼你應該重寫'hashCode()'。 – JonK

相關問題