Tag: 迭代器

Java枚举与迭代器的区别

这两个接口有什么区别? Enumeration是否比使用Iterator有好处? 如果有人可以详细说明,请参考文章,将不胜感激。

估计统计中位数,模式,偏度,峰度的“在线”(迭代器)algorithm?

是否有algorithm来估计一组值的中位数,模式,偏度和/或峰度,但不要求将所有的值一次存储在内存中? 我想计算一下基本的统计数据: 意思是:算术平均值 方差:平均偏差的平均值 标准偏差:方差的平方根 中值:将较大一半的数字与较小的一半分开的值 模式:在集合中find的最频繁的值 偏度:tl; 博士 峰度:tl; 博士 计算任何这些的基本公式是小学算术,我知道他们。 有很多统计库也可以实现它们。 我的问题是我正在处理的集合中有大量数值(数十亿):使用Python,我不能仅仅制作一个包含数十亿个元素的列表或哈希值。 即使我用C语言写这个,十亿个元素的数组也不太实际。 数据没有sorting。 它是由其他进程随机,随机产生的。 每一套的大小是非常可变的,大小不会事先知道。 我已经知道如何很好地处理均值和方差,以任何顺序遍历集合中的每个值。 (实际上,就我而言,我将它们按照生成顺序排列)。下面是我正在使用的algorithm, http : //en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm : 初始化三个variables:count,sum和sum_of_squares 对于每个值: 增量计数。 将该值添加到总和。 将值的平方加到sum_of_squares。 除数和存储为variables的意思。 按count计算sum_of_squares,作为variablesmean_of_squares存储。 正方形的意思是,存储为square_of_mean。 从mean_of_squares减去square_of_mean,作为方差存储。 产出均值和方差。 这种“在线”algorithm存在缺陷(例如,由于sum_of_squares快速增长大于整数范围或浮点精度),但基本上给了我所需要的,而不必在每个集合中存储每个值。 但我不知道是否有类似的技术来估计额外的统计数据(中位数,模式,偏度,峰度)。 只要处理N值所需的内存大大小于O(N),我就可以忍受一个有偏差的估计器,甚至是一个在一定程度上降低精度的方法。 如果图书馆具有计算一个或多个“联机”操作的function,指向现有的统计图书馆也将有所帮助。

我们可以在Java中编写我们自己的迭代器吗?

如果我有一个包含[alice, bob, abigail, charlie] ,我想编写一个迭代器,以迭代以“a”开头的元素,我可以写我自己的? 我怎样才能做到这一点 ?

从Python迭代器中获取最后一项的最简单的方法

从Python 2.6的迭代器中获取最后一项的最好方法是什么? 比如说 my_iter = iter(range(5)) 什么是从my_iter获得4的最短代码/最干净的方式? 我可以做到这一点,但似乎并不高效: [x for x in my_iter][-1]

迭代器可以在Python中重置吗?

我可以重置Python中的迭代器/生成器吗? 我正在使用DictReader,并希望将其重置(从csv模块)到文件的开始。

迭代器和迭代器有什么区别,以及如何使用它们?

我是新来的Java,我真的很困惑迭代器和迭代。 任何人都可以解释给我一些例子吗?

迭代vector,去掉某些项目

我有一个std ::向量m_vPaths; 我将迭代这个向量,并随时调用:: DeleteFile(strPath)。 如果我成功删除了文件,我会从vector中删除它。 我的问题是我可以绕过不得不使用两个向量? 有不同的数据结构可能更适合我需要做的吗? 例如:使用迭代器几乎做我想要的,但问题是一旦你使用迭代器擦除,所有迭代器变得无效。 std::vector<std::string> iter = m_vPaths.begin(); for( ; iter != m_vPaths.end(); iter++) { std::string strPath = *iter; if(::DeleteFile(strPath.c_str())) { m_vPaths.erase(iter); //Now my interators are invalid because I used erase, //but I want to continue deleteing the files remaining in my vector. } } 我可以使用两个向量,我将不再有问题,但有没有更好,更有效的方法来做我想做的事情? 顺便说一句,因为目前还不清楚,m_vPaths是这样宣布(在我的class级): std::vector<std::string> m_vPaths;

vector擦除迭代器

我有这个代码: int main() { vector<int> res; res.push_back(1); vector<int>::iterator it = res.begin(); for( ; it != res.end(); it++) { it = res.erase(it); //if(it == res.end()) // return 0; } } “一个随机访问迭代器指向元素的新位置,后面跟着被函数调用擦除的最后一个元素,如果操作删除了序列中的最后一个元素,则这是向量结尾。 此代码崩溃,但如果我使用if(it == res.end()),然后返回它的作品。 怎么来的? for循环是否获取res.end()以便不等于运算符失败?

如何使用迭代器?

我试图计算两点之间的距离。 我用C ++存储在vector中的两点:(0,0)和(1,1)。 我应该得到的结果 0 1.4 1.4 0 但是我得到的实际结果是 0 1 -1 0 我认为在向量中使用迭代器的方式有些问题。 我该如何解决这个问题? 我发布了下面的代码。 typedef struct point { float x; float y; } point; float distance(point *p1, point *p2) { return sqrt((p1->x – p2->x)*(p1->x – p2->x) + (p1->y – p2->y)*(p1->y – p2->y)); } int main() { vector <point> po; point p1; p1.x = […]

如何将一个迭代器转换为一个stream?

我正在寻找一种简洁的方式来将Iterator转换为Stream或者更具体地说,将迭代器“查看”为stream。 出于性能的原因,我想避免在新列表中的迭代器的副本: Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Collection<String> copyList = new ArrayList<String>(); sourceIterator.forEachRemaining(copyList::add); Stream<String> targetStream = copyList.stream(); 根据评论中的一些build议,我也尝试使用Stream.generate : public static void main(String[] args) throws Exception { Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Stream<String> targetStream = Stream.generate(sourceIterator::next); targetStream.forEach(System.out::println); } 但是,我得到一个NoSuchElementException (因为没有调用hasNext ) Exception in thread "main" java.util.NoSuchElementException at java.util.AbstractList$Itr.next(AbstractList.java:364) at Main$$Lambda$1/1175962212.get(Unknown Source) at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351) […]