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

本文关键字:转换 java 片段 代码 | 更新日期: 2023-09-27 18:17:09

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

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

Point本身在Point类型上实现和Iterable似乎有点奇怪。Point的一个实例(一个特定的Point对象通常不应该知道其他点的太多信息……),您可能更愿意使用某种集合来做这件事。但是假设你只是想那样做…

可以使用guava的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
    }
}