2016-11-08 58 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