将一些代码片段从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()
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
}
}