我有一个对象子类,它__ 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)
它似乎工作......有没有我可能不知道的陷阱?我做的事情有多荒谬吗?
我想实现一个从磁盘/网络中检索对象的迭代器.
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) 因为有时它比围绕队列设计解决方案更实用,我想编写一个简单的包装器来使迭代器线程安全.到目前为止,我从这些 主题中获得了灵感,并提出了两个想法:
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)
我不喜欢的是,如果我必须指定所有可能的方法,它会变得有点冗长 - 好吧,我不能 - 比如发电机的特殊情况.此外,我可能有一些其他迭代器,甚至更具体的方法现在已隐藏.
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不再将我的对象识别为迭代器!
什么是使所有迭代器(甚至更好:所有对象)都能工作的最佳方法,而不会产生漏洞抽象?在没有必要时我不太担心锁定,但是如果你能想出一个解决这个问题的解决方案,那太好了!
我有一个std::multimap,我想创建一个boost::iterator_range从equal_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范围的重载.
我需要能够处理大型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) 我喜欢使用迭代器原理的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,但不是很好.对于上面的例子,是否也可以用迭代器确定最后一个元素?
正如标题所说,当我实例化一个类时,我收到了这条消息:
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了.希望有人知道我做错了什么:)
我必须处理一个 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) 我在循环中有各种场景,我会在迭代项目进行处理时"偷看"或"跳过".
一种情况是我通过文件的行来枚举,并且在行的末尾有一个"延续"字符,表示将下一行与当前行组合.如果我只是循环而不是太难,我可以阅读下一行,然后碰到我的计数器/索引.
使用我的迭代器执行此操作的模式并不明显.我实际上想要在不退出关闭的情况下使用下一行.但我甚至不确定这是否可行.使用闭包这个迭代模式是否有任何好的设计模式,所以我不必诉诸于一个不太常规的循环?它可能是一种迭代器形式,有一些堆栈用于推送/弹出项目进行处理?
可以使用迭代器范围构造一个向量,如下所示:
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,对吧?