2016-11-08 65 views
-1

我將一些代碼從c#轉換爲java。我無法弄清楚如何做下面的轉換將一些c#代碼片段轉換爲java

struct Point : IEnumerable<Point>{ 
    public int X; 
    public int Y; 

IEnumerator<Point> IEnumerable<Point>.GetEnumerator() 
    { 
     Point point = new Point(); 
     for (point.Y = 0; point.Y < Y; ++point.Y) 
      for (point.X = 0; point.X < X; ++point.X) 
       yield return point; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IEnumerable<Point>)this).GetEnumerator(); 
    }} 

這裏是我的轉換:

public class Point implements Iterable<Point>{ 
int X; 
int Y; 

/* 
* IEnumerator IEnumerable.GetEnumerator() 
    * { 
    *  return ((IEnumerable<Point>)this).GetEnumerator(); 
    * } 
*/ 
@Override 
public Iterator<Point> iterator() { 
    return ((Iterable<Point>)this).iterator(); 
}} 

這將是第2個功能IEnumerable<Point>.GetEnumerator()

+0

如果您對評論投票,它會真的幫助。謝謝 – naveed

回答

0

相當於這似乎有點怪Point本身將在Point類型上實現和Iterable。一個點的實例(一個特定的點對象通常應該對其他點不太瞭解......),你可能更喜歡做某種類型的集合。但假設你想這樣做...

你可以使用番石榴的PeekingIterator。如果你正在使用maven,下面的依賴將整齊地帶給你,否則你需要jar。

<!-- https://mvnrepository.com/artifact/com.google.guava/guava-jdk5 --> 
<dependency> 
    <groupId>com.google.guava</groupId> 
    <artifactId>guava-jdk5</artifactId> 
    <version>17.0</version> 
</dependency> 

一旦你擁有了它,它也不是很複雜,使用 這裏有一個例子(的,我只是執行部分涉及到你的第二個功能):

public class Point implements Iterable<Point> { 

    // Additional code here 
    private Iterator<Point> pointIterator; 

    public Point (Iterator<Point> pointIterator) { 
     this.pointIterator = pointIterator; 
    } 
    @Override 
    public Iterator<Point> iterator() { 
     return pointIterator; 
    } 


    PeekingIterator<Point> getEnumerator() { 
     if (pointIterator instanceof PeekingIterator) { 
      return (PeekingIterator<Point>)pointIterator; 
     } else { 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     Point myPoint = new Point(new PeekingIteratorMock()); 
     PeekingIterator<Point> myIterator = myPoint.getEnumerator(); 
     Point p; 
     while ((p = myIterator.next()) != null) { 
      // Do something usefull here 
     } 
    } 

} 

的PeekingIterator是接口,所以你需要傳遞一個具體的實現,如果你想有一個實際的測試用例。我需要讓它無法完成。

public class PeekingIteratorMock implements PeekingIterator<Point> { 

    @Override 
    public boolean hasNext() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Point next() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Point peek() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void remove() { 
     // TODO Auto-generated method stub 

    } 

} 
+0

謝謝。這有所幫助。 – naveed

+0

@naveed我很高興它做到了:) – alainlompo