gpt4 book ai didi

java - 即使我通过打印每个元素进行验证后,Iterable 也会抛出 NoSuchElementException

转载 作者:行者123 更新时间:2023-12-01 13:18:55 25 4
gpt4 key购买 nike

我有一堆Map<Integer, TreeSet<Double>>对象,我将这些值传递给另一个方法。我有一个NoSuchElementException在该方法中,开始调试,并看到对 Map#values() 的调用抛出此异常。但是,当我循环遍历这些值时,它会完美地打印所有值。这是导致此问题的代码片段:

Map<Integer, TreeMultimap<String, Double>> kMap = Maps.newTreeMap();
for (int i = 0; i < 3; i++) {
TreeMultimap<String, Double> treeMultimap = TreeMultimap.create();
treeMultimap.putAll("a" + i, Lists.newArrayList(0.0, 0.06, 0.17, 0.23));
treeMultimap.putAll("b" + i, Lists.newArrayList(0.0, 0.16, 0.34, 0.49));
kMap.put(i, treeMultimap);
}

Map<Integer, TreeSet<Double>> rescaledKMap =
Maps.transformEntries(kMap, ToRescaledValueMap(1.2));

Iterable<TreeSet<Double>> treeSets = rescaledKMap.values();

// Prints out each element correctly. No exception is thrown.
for (TreeSet<Double> set : treeSets)
System.out.println(Joiner.on(',').join(set));

// NoSuchElementException thrown in getMeanPlot() before anything happens there.
TreeMap<Double, Double> mean_rescaledKMap =
getMeanPlot(rescaledKMap.values());

签名是getMeanPlot(Iterable<TreeSet<Double>>) .

可迭代对象在传递给第二个方法之前是如何正确的,但在第二个方法开始时抛出异常?

堆栈跟踪

堆栈跟踪显示 Maps.EntryTransformer对象ToRescaledValueMap作为罪魁祸首。这是跟踪:

Exception in thread "main" java.util.NoSuchElementException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1113)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1151)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1146)
at com.google.common.collect.AbstractMapBasedMultimap$Itr.next(AbstractMapBasedMultimap.java:1145)
at com.google.common.collect.Ordering.min(Ordering.java:460)
at com.google.common.collect.Ordering.min(Ordering.java:479)
at DistributionMetricExperiment$6.transformEntry

这与 Guava 的延迟初始化有什么关系吗?我可以编写自己的小方法,而不是使用 Maps#transformEntries方法,但不知道这个错误背后的原因......嗯......困扰我。条目变换如下:

static Maps.EntryTransformer<Integer, TreeMultimap<String,Double>, TreeSet<Double>>
ToRescaledValueMap(final double interval_length) {
return new Maps.EntryTransformer<Integer, TreeMultimap<String,Double>, TreeSet<Double>>()
{
public TreeSet<Double> transformEntry(Integer i, TreeMultimap<String,Double> mmap) {
double mmap_min = Ordering.natural().min(mmap.values());
double mmap_max = Ordering.natural().max(mmap.values());
TreeSet<Double> rescaledValues = Sets.newTreeSet();
for (double val : mmap.values())
rescaledValues.add(interval_length * (val - mmap_min)/(mmap_max - mmap_min));
return rescaledValues;
}
};
}

编辑:

  • 我不知道这是否重要,但想补充一点,我还发出了与 Iterable<TreeSet<Double> 的第一个语句相同的打印语句(上面代码中对 getMeanPlot 的 for 循环)。 。即使在那里,它也可以正常打印,然后抛出异常。
  • 对于在变量名称中使用下划线,我深表歉意。这些变量反射(reflect)了我在代码背后的数学中使用的下标。我知道命名约定,但在这段代码中,我更注重通过查看变量来识别其数学含义的能力。

最佳答案

实际上你打印了TreeSet<Double> set这会误导您认为您的 Collection 已被填充。因为你的错误不在set上而是TreeMultimap<String,Double> mmap :你执行Ordering.natural().min(mmap)这就是问题的根源。 Guava 指定在空集合中查找最小(或最大)元素将导致抛出 NoSuchElementException ,这就是您这里所拥有的。

关于java - 即使我通过打印每个元素进行验证后,Iterable 也会抛出 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com