将一些代码片段从c#转换为java

时间:2016-11-08 15:37:06

标签: java c# .net

我正在将一些代码从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();
}}

第二个函数IEnumerable<Point>.GetEnumerator()

的等价物

1 个答案:

答案 0 :(得分:0)

Point本身将在Point类型上实现和Iterable似乎有点奇怪。 Point的一个实例(一个特定的Point对象通常应该对其他点知之甚少......),你可能宁愿有某种类型的集合这样做。但是假设你想做那个......

您可以使用番石榴的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

    }

}