标签: iterator

__iter __()实现为生成器

我有一个对象子类,它__ iter __使用缓存生成器实现动态调度(我还有一个使iter缓存无效的方法),如下所示:

def __iter__(self):
    print("iter called")
    if self.__iter_cache is None:
        iter_seen = {}
        iter_cache = []
        for name in self.__slots:
            value = self.__slots[name]
            iter_seen[name] = True
            item = (name, value)
            iter_cache.append(item)
            yield item           
        for d in self.__dc_list:
            for name, value in iter(d):
                if name not in iter_seen:
                    iter_seen[name] = True
                    item = (name, value)
                    iter_cache.append(item)
                    yield item
        self.__iter_cache = iter_cache
    else:
        print("iter cache hit")
        for item in self.__iter_cache:
            yield item
Run Code Online (Sandbox Code Playgroud)

它似乎工作......有没有我可能不知道的陷阱?我做的事情有多荒谬吗?

python iterator generator dispatch

8
推荐指数
2
解决办法
3040
查看次数

如何创建抛出IOException的Java Iterator

我想实现一个从磁盘/网络中检索对象的迭代器.

Iterator itr = getRemoteIterator();
while(itr.hasNext()) {
    Object element = itr.next();
    System.out.print(element + " ");
}
Run Code Online (Sandbox Code Playgroud)

然而问题是,hasNext()next()该方法的迭代器对象不允许扔IOException.是否还有其他标准接口可以解决此问题?

期望的代码是:

public interface RemoteIterator<E> {
    boolean hasNext() throws IOException;
    E next() throws IOException;
    void remove();
}
Run Code Online (Sandbox Code Playgroud)

java iterator ioexception java-7

8
推荐指数
2
解决办法
3642
查看次数

如何包装Python迭代器以使其线程安全?

因为有时它比围绕队列设计解决方案更实用,我想编写一个简单的包装器来使迭代器线程安全.到目前为止,我从这些 主题中获得了灵感,并提出了两个想法:

想法1

class LockedIterator(object):
    def __init__(self, it):
        self._lock = threading.Lock()
        self._it = it.__iter__()
        if hasattr(self._it, 'close'):
            def close(self):
                with self._lock:
                    self._it.close()
            self.__setattr__('close', close)

    def __iter__(self):
        return self

    def next(self):
        with self._lock:
            return self._it.next()
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是,如果我必须指定所有可能的方法,它会变得有点冗长 - 好吧,我不能 - 比如发电机的特殊情况.此外,我可能有一些其他迭代器,甚至更具体的方法现在已隐藏.

想法2

class LockedIterator(object):
    def __init__(self, it):
        self._lock = threading.Lock()
        self._it = it.__iter__()

    def __getattr__(self, item):
        attr = getattr(self._it, item)
        if callable(attr):
            def hooked(*args, **kwargs):
                with self._lock:
                    return attr(*args, **kwargs)
            setattr(self, item, hooked)
            return hooked
Run Code Online (Sandbox Code Playgroud)

这更简洁,但它只能拦截调用,而不是直接的属性更改.(现在隐藏这些属性以防止出现问题.)更重要的是,它使得Python不再将我的对象识别为迭代器!

什么是使所有迭代器(甚至更好:所有对象)都能工作的最佳方法,而不会产生漏洞抽象?在没有必要时我不太担心锁定,但是如果你能想出一个解决这个问题的解决方案,那太好了!

python iterator thread-safety python-2.7

8
推荐指数
1
解决办法
5849
查看次数

将std :: pair迭代器转换为boost :: iterator_range

我有一个std::multimap,我想创建一个boost::iterator_rangeequal_range.我在文档中找不到简单的方法,所以我尝试了以下方法:

typedef std::multimap<int, std::string> Map;
Map map;
...
boost::iterator_range<Map::iterator> r(map.equal_range(2));
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它的工作原理(使用GCC 4.1.2).我很好奇它是如何工作的.我发现iterator_range构造函数没有重载会发生这种情况,multimap::iterator_range显然没有返回Boost范围的重载.

c++ boost iterator boost-range

7
推荐指数
1
解决办法
2140
查看次数

在Scala中扫描一个巨大的JSON文件以获取可反序列化的数据

我需要能够处理大型JSON文件,从可反序列化的子字符串中实例化对象,因为我们正在迭代/流式传输文件.

例如:

假设我只能反序列化为以下实例:

case class Data(val a: Int, val b: Int, val c: Int)
Run Code Online (Sandbox Code Playgroud)

和预期的JSON格式是:

{   "foo": [ {"a": 0, "b": 0, "c": 0 }, {"a": 0, "b": 0, "c": 1 } ], 
    "bar": [ {"a": 1, "b": 0, "c": 0 }, {"a": 1, "b": 0, "c": 1 } ], 
     .... MANY ITEMS .... , 
    "qux": [ {"a": 0, "b": 0, "c": 0 }  }
Run Code Online (Sandbox Code Playgroud)

我会喜欢做的是:

import com.codahale.jerkson.Json
val dataSeq : Seq[Data] = Json.advanceToValue("foo").stream[Data](fileStream)
// NOTE: this will …
Run Code Online (Sandbox Code Playgroud)

json iterator scala stream jerkson

7
推荐指数
1
解决办法
2414
查看次数

使用迭代器时如何确定最后一个元素?

我喜欢使用迭代器原理的for循环,比如

for(String s : collectionWithStrings)
    System.out.println(s + ", ");
Run Code Online (Sandbox Code Playgroud)

问题:如何确定当前元素是否是最后一个元素?

有这样的自己的索引int = 0; i < collection.size(); i++是可能的i == collection.size() - 1,但不是很好.对于上面的例子,是否也可以用迭代器确定最后一个元素?

java iterator

7
推荐指数
2
解决办法
8743
查看次数

发现致命错误RecursiveIteratorIterator

正如标题所说,当我实例化一个类时,我收到了这条消息:

Fatal error: Class 'Envato\RecursiveIteratorIterator' not found in C:\Users\rgr\Apache\htdocs\Roland Groza [ 3.0 ]\class\envato\envato.php on line 359
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看课程:Class ;

我正在从另一个文件中实例化:

require("envato.php");
$test = new Envato\EnvatoAPIWrapper();
echo "User Vitals : ".$test->get_user_vitals("chaoscod3r")."<br>";
Run Code Online (Sandbox Code Playgroud)

该类包含一个命名空间,因此可能与它有关,但我不确定,因为我已经有几年没有编写PHP了.希望有人知道我做错了什么:)

php spl iterator namespaces class

7
推荐指数
1
解决办法
3144
查看次数

如何在java中将两个迭代器保留在map上,并在没有ConcurrentModificationException的情况下删除其间的键

我必须处理一个 Map <BitSet,List<List<Integer>> MyMap

if (key1 contains all of corresponding true bits of key2)
     Remove from key2 all those values which are common with key1)
Run Code Online (Sandbox Code Playgroud)

在此过程中,如果列表中的元素数量低于THRESHOLD(用户定义的正整数),则将其删除.此外,如果Map包含空列表,则删除相应的键.

我使用以下代码:

List<BitSet> keys = new ArrayList<>(MyMap.keySet());  
ListIterator it1=keys.listIterator();
while(it1.hasNext())  {
     BitSet key1=(BitSet)it1.next();
     ListIterator it2=keys.listIterator(it1.nextIndex());
     while(it2.hasNext()) {
         BitSet key2=(BitSet)it2.next();                 
         BitSet ankey=(BitSet)key1.clone();
         ankey.and(key2);    
         if(ankey.equals(key1)) {//key1 is subset and key2 is superset
               if(removePoints(key1,key2))  {
                     it1.remove();
                     break;
               }
         }
         else if(ankey.equals(key2))  {                           
              if(removePoints(key2,key1))  {
                    it2.remove();                         
              }
         }
     }
}

public static boolean removePoints(BitSet key1,BitSet key2)
 {
     List<List<Integer>> list1=MyMap.get(key1); …
Run Code Online (Sandbox Code Playgroud)

java iterator hashmap concurrentmodification

7
推荐指数
1
解决办法
1579
查看次数

Groovy'偷看'使用迭代器?

我在循环中有各种场景,我会在迭代项目进行处理时"偷看"或"跳过".

一种情况是我通过文件的行来枚举,并且在行的末尾有一个"延续"字符,表示将下一行与当前行组合.如果我只是循环而不是太难,我可以阅读下一行,然后碰到我的计数器/索引.

使用我的迭代器执行此操作的模式并不明显.我实际上想要在不退出关闭的情况下使用下一行.但我甚至不确定这是否可行.使用闭包这个迭代模式是否有任何好的设计模式,所以我不必诉诸于一个不太常规的循环?它可能是一种迭代器形式,有一些堆栈用于推送/弹出项目进行处理?

groovy closures iterator peek

7
推荐指数
1
解决办法
820
查看次数

使用迭代器的初始化列表构造容器

可以使用迭代器范围构造一个向量,如下所示:

std::vector<std::string> vec(std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{});
Run Code Online (Sandbox Code Playgroud)

但我也可以使用C++ 11统一初始化语法编译和运行代码(注意括号),如下所示:

std::vector<std::string> vec{std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{}};
Run Code Online (Sandbox Code Playgroud)

这里到底发生了什么?

我知道采用初始化列表的构造函数优先于其他形式的构造.编译器是否应该解析为构造函数采用包含2个元素的初始化列表std::istream_iterator?这应该是一个错误,因为std::istream_iterator无法转换为矢量值类型std::string,对吧?

c++ iterator uniform-initialization c++11

7
推荐指数
1
解决办法
796
查看次数