我对Java中的迭代器行为有疑问.
我有一个这样的电话:
myIterable.iterator().hasNext()
如果此调用返回true,我可以确定该集合至少有两个元素吗?从Java API规范中,我只能发现真正意味着还有一个元素可以通过它来实现next().但是如果指针位于最开始会发生什么(意味着是否hasNext()可以单独识别第一个元素)
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html
如果迭代有更多元素,则表示为true.但更多元素也可能意味着第一个?
[编辑]
我怎么知道迭代器是否有两个要迭代的元素?当然,我可以迭代和计数,但我无法返回或迭代两次或在我的情况下克隆迭代器,这是一个Hadoop迭代器.
我有一个实现 Iterable 的类,但有自己的hasNext()和这样的next()方法:
public class BLMovie implements Iterable<BLMovieFrame> {
@Override
public Iterator<BLMovieFrame> iterator() {
iteratorVar = 0;
return liste.iterator();
}
public boolean hasNext() {
if (loop)
return true;
return iteratorVar < liste.size();
}
public BLMovieFrame next() {
iteratorVar = (iteratorVar++)%(liste.size()-1);
return liste.get(iteratorVar);
}
public void remove() {
throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)
我很确定这不是最好的方法,
关于 Iterable 的其他线程似乎并不关心自己的下一个方法,所以有人对我有建议吗?
我有一个实现 Iterable 的自定义列表(不是集合!!)。我没有实现 List ,因为这会带来太多我不想要的方法,而且我不需要。
关于我的 CustomList 的更多信息:
所以这是我的班级:
public class CustomList implements Iterable<MyThing> {
private final CustomList sublist;
private final MyThing thing;
// getters and other methods
}
Run Code Online (Sandbox Code Playgroud)
我有一个
Comparator<MyThing>
Run Code Online (Sandbox Code Playgroud)
我的事情:
public class MyThing {
private final IntArrayList values;
// more members and methods
}
Run Code Online (Sandbox Code Playgroud)
我想获得一个排序副本作为我的 …
我使用的是离子3,因此是角度和打字稿。
我想要实现的是将ngFor与Map类型结合使用。
这是我所拥有的:
interface IShared_Position {
lat: number;
lng: number;
time: number;
color?: string;
}
public shared_position = new Map<string, IShared_Position>();
Run Code Online (Sandbox Code Playgroud)
现在从html方面,我有:
<ion-list>
<ion-item ion-item *ngFor="let item of shared_position">
<h2>{{ item.time }}</h2>
</ion-item>
Run Code Online (Sandbox Code Playgroud)
现在,这给了我以下错误:
错误:找不到类型为“对象”的其他支持对象“ [对象图]”。NgFor仅支持绑定到Iterables,例如数组。
现在有什么可能的方法,即使它不是可迭代的,我也无法绑定我的地图?
我该怎么办?
Pytorch Dataloader 的迭代顺序是否保证相同(在温和条件下)?
例如:
dataloader = DataLoader(my_dataset, batch_size=4,
shuffle=True, num_workers=4)
print("run 1")
for batch in dataloader:
print(batch["index"])
print("run 2")
for batch in dataloader:
print(batch["index"])
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试对其进行测试,但它似乎没有修复,两次运行的顺序相同。有没有办法使订单相同?谢谢
编辑:我也试过做
unlabeled_sampler = data.sampler.SubsetRandomSampler(unlabeled_indices)
unlabeled_dataloader = data.DataLoader(train_dataset,
sampler=unlabeled_sampler, batch_size=args.batch_size, drop_last=False)
Run Code Online (Sandbox Code Playgroud)
然后遍历数据加载器两次,但结果是相同的不确定性。
我正在寻找一种方便的方法来安全地将 a List<T?>to List<T>?(或更一般地说,Iterable<T?>to Iterable<T>?)投射到不过滤任何元素的情况下。
换句话说,如果所有元素都不为空,则取列表。
在 Swift 中,我可以这样做:
let a: [Int?] = [1, nil, 3]
let b: [Int?] = [1, 2, 3]
let aa = a as? [Int] // nil
let bb = b as? [Int] // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
在科特林中,同样看代码只是做一个未经检查的演员和工作不会导致aa为null:
val a = listOf<Int?>(1, null, 3)
val b = listOf<Int?>(1, 2, 3)
val aa = a as? List<Int> // [1, null, 3]
val bb = b as? List<Int> // …Run Code Online (Sandbox Code Playgroud) 我有一个小程序,它依赖于从本地网络接口获取一些信息。然后,我需要添加一些功能,这又需要这些信息。我不想碰我经过测试和高度使用的方法。因此,迫于时间的压力,我决定重用该方法,有效地将 NetworkInterface Enumeration 转换为 ArrayList两次(这不是我最自豪的编码时刻!)。
经过测试,我发现它真的不起作用!
动作顺序:
我注意到,在第二次翻译中,结果为零!在调试中,我注意到我的枚举有一个字段“i”。该字段:第一次,它等于 55(我的 IF 的计数),第二次,它等于 0...
我提供了一小段代码,为了您的调试乐趣,应该重现它(我使用的是 Java 8):
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
public class CollectionsListDemo {
public static void main(String[] args) {
ArrayList<NetworkInterface> netFacesArList1;
ArrayList<NetworkInterface> netFacesArList2;
try {
Enumeration<NetworkInterface> netFaces = NetworkInterface.getNetworkInterfaces();
netFacesArList1 = Collections.list(netFaces);
netFacesArList2 = Collections.list(netFaces);
} catch (Exception e) {
throw new RuntimeException("whatever");
}
System.out.println(netFacesArList1.size()); // 55, …Run Code Online (Sandbox Code Playgroud) 我对有关此功能的文档/提供的使用示例感到有些困惑。是否flatten只能发生一次?喜欢
List(List(1, 2), List(3, List(4, 5, 6))) -> List(1, 2, 3, List(4, 5, 6))
Run Code Online (Sandbox Code Playgroud)
或者您以某种方式指定展平的深度,以便它可以成为List(1, 2, 3, 4, 5, 6)?
因为,例如,在 JS 中,函数似乎可以flat()进入一维数组的任何深度。Scala 能flatten做到这一点还是只能提升一次?
我正在尝试自己重新创建该功能,并希望模仿所需的行为并了解其工作方式可能不同的原因。
考虑以下代码:
import more_itertools as mo
def rep(x, n):
for i in range(n):
yield x
xs = [0]
for n in [1, 2, 3]:
xs = mo.flatten(rep(x, n) for x in xs)
print(mo.ilen(xs))
Run Code Online (Sandbox Code Playgroud)
正确答案应该是 6,但它打印出 27,为什么?
请注意,它more_itertools.flatten做了显而易见的事情,实际上是itertools.chain.from_iterable. more_itertools.ilen也做了显而易见的事情,只计算元素。我不认为所涉及的功能有任何错误,只是重新签名的问题xs。
在 Python 中,迭代列表时无法修改列表。例如,下面我无法修改list_1,并且结果print将是[0, 1, 2, 3, 4]。在第二种情况下,我循环遍历类实例列表,并调用该set_n方法修改列表中的实例,同时迭代它。确实,意志print给予[4, 4, 4, 4, 4]。
这两个案例有何不同,为什么?
# First case: modify list of integers
list_1 = [0, 1, 2, 3, 4]
for l in list_1:
l += 1
print(list_1)
# Second case: modify list of class instances
class Foo:
def __init__(self, n):
self.n = n
def set_n(self, n):
self.n = n
list_2 = [Foo(3)] * 5
for l in list_2:
l.set_n(4)
print([l.n for …Run Code Online (Sandbox Code Playgroud)