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