有没有一种简单的方法可以在PHP中对迭代器进行排序(而不是将其全部拉入数组并对其进行排序).
我具有的具体示例是DirectoryIterator,但是对任何迭代器都有一个通用的解决方案会很好.
$dir = new DirectoryIterator('.');
foreach ($dir as $file)
echo $file->getFilename();
Run Code Online (Sandbox Code Playgroud)
我希望能够通过各种标准(文件名,大小等)对它们进行排序
我正在使用dotCover来分析我的单元测试的代码覆盖率,并且我得到了一些奇怪的结果......我有一个迭代器方法,覆盖范围不完整,但是未涵盖的语句只是结束括号在方法的最后.
这是我正在测试的方法:
public static IEnumerable<T> CommonPrefix<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
source.CheckArgumentNull("source");
other.CheckArgumentNull("other");
return source.CommonPrefixImpl(other, comparer);
}
private static IEnumerable<T> CommonPrefixImpl<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (IEnumerator<T> en1 = source.GetEnumerator(),
en2 = other.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
{
if (comparer.Equals(en1.Current, en2.Current))
yield return en1.Current;
else
yield break;
}
} // not covered
} // not covered
Run Code Online (Sandbox Code Playgroud)
单元测试:
[Test]
public void Test_CommonPrefix_SpecificComparer()
{
var first = new[] { …Run Code Online (Sandbox Code Playgroud) 假设您想以随机顺序迭代序列[0到n],只访问每个元素一次.有没有办法在O(1)内存中执行此操作,即不创建[1..n]序列std::iota并运行它std::random_shuffle?
某种迭代器以随机顺序吐出序列将是最佳的.
要求是应该可以通过选择另一个种子来获得另一个随机顺序.
我有以下示例代码,其中包含3个嵌套的for循环.
for(Continent continent : continentList)
{
for(Country country : continent.getCountries())
{
for(City city : country.getCities())
{
//Do stuff with city objects
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用Guava和迭代器来模仿这个嵌套的for循环?我一直试图找到一个没有太多运气的合适例子,我想知道是否有人可以帮助我?我的一位同事提到使用过滤器.
编辑:修复了示例代码中的小错误
我正在尝试使用迭代器在我的Logs列表中遍历列表.目标是搜索包含与新日志相同的语音,类型和日期的日志
但是,我在条件语句中得到了java.util.NoSuchElementException.有谁知道可能导致问题的原因是什么?
我的代码
public void addLog(String phonenumber, String type, long date, int incoming, int outgoing)
{
//Check if log exists or else create it.
Log newLog = new Log(phonenumber, type, date, incoming, outgoing);
//Log exists
Boolean notExist = false;
//Iterator loop
Iterator<Log> iterator = logs.iterator();
while (iterator.hasNext())
{
//This is where get the exception
if (iterator.next().getPhonenumber() == phonenumber && iterator.next().getType() == type && iterator.next().getDate() == date)
{
updateLog(newLog, iterator.next().getId());
}
else
{
notExist = true;
}
}
if (notExist)
{ …Run Code Online (Sandbox Code Playgroud) 通过例如引导锈示出了下面的代码在这里为一个斐波纳契数列与迭代:
fn next(&mut self) -> Option<u32> {
let new_next = self.curr + self.next;
let new_curr = mem::replace(&mut self.next, new_next);
// 'Some' is always returned, this is an infinite value generator
Some(mem::replace(&mut self.curr, new_curr))
}
Run Code Online (Sandbox Code Playgroud)
我想了解这是什么优势,而不是最直观的(如果你来自其他语言):
fn next(&mut self) -> Option<u32> {
let tmp = self.next;
self.next = self.curr + self.next;
self.curr = tmp;
Some(self.curr)
}
Run Code Online (Sandbox Code Playgroud) 我试图从a中删除一些元素List,但即使是最简单的例子,就像这个答案或者这个中的元素一样,也行不通.
public static void main(String[] args)
{
List<String> list = Arrays.asList("1", "2", "3", "4");
for (Iterator<String> iter = list.listIterator(); iter.hasNext();)
{
String a = iter.next();
if (true)
{
iter.remove();
}
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
使用正常Iterator而不是a ListIterator没有帮助.我错过了什么?我正在使用java 7.
我很困惑为什么一个子类ArrayIterator永远不会__construct调用它的方法.考虑这个例子:
<?php
class ConstructorException extends Exception {}
class Foo extends ArrayObject {
function __construct( $arr = array(), $flags = 0, $iterator = 'ArrayIterator' ) {
$iterator = 'FooIterator';
parent::__construct( $arr, $flags, $iterator );
}
}
class FooIterator extends ArrayIterator {
function __construct( $array = array(), $flags = 0 ) {
throw new ConstructorException( 'HELLO WORLD' ); // I AM NEVER CALLED.
parent::__construct( $array, $flags );
}
}
try {
$f = new Foo( array( 1, 2, …Run Code Online (Sandbox Code Playgroud) 这是我一直想知道的事情.我将提出Python的问题,但我也欢迎解决Java和C++标准库的问题.
假设您有一个名为"my_list"的Python列表,并且您希望迭代其独特元素.有两种自然方法:
#iterate over set
for x in set(my_list):
do_something(x)
Run Code Online (Sandbox Code Playgroud)
要么
#list to set to list
for x in list(set(my_list)):
do_something(x)
Run Code Online (Sandbox Code Playgroud)
紧张是在列表上迭代比在集合上迭代更快,但是将集合转换为列表需要时间.我的猜测是,这个问题的答案取决于许多因素,例如:
所以我想我正在寻找形式的经验法则"如果列表有x个元素,每个元素重复不超过y次,你只需要迭代z次,那么你应该遍历集合;否则你应该把它转换成一个清单."
鉴于int foo[] = {0, 1, 2, 3};我想知道指向过去"一个过去"的迭代器是否无效.例如:auto bar = cend(foo) + 1;
有大量的抱怨和警告,这是Stack Overflow问题中的"未定义行为",如下所示:c ++当过去结束迭代器时,迭代器+整数的结果是什么?不幸的是,唯一的来源是挥手.
我购买它的麻烦越来越多,例如:
int* bar;
Run Code Online (Sandbox Code Playgroud)
是未初始化的,但肯定不会调用未定义的行为,并且给定了足够的尝试,我确信我可以找到一个实例,其中未初始化的值bar具有相同的值cend(foo) + 1.
这里最大的困惑之一是我不会要求解除引用cend(foo) + 1.我知道这将是未定义的行为,标准禁止它.但是这样的答案:https://stackoverflow.com/a/33675281/2642059只引用解除引用这样的迭代器是非法的,不回答这个问题.
我也知道C++只保证它cend(foo)是有效的,但它可能会numeric_limits<int*>::max()在这种情况下cend(foo) + 1溢出.我对这种情况不感兴趣,除非它在标准中被调出,因为我们不能让迭代器超过"一个接一个结束".我知道这int*只是一个整数值,因此会受到溢出的影响.
我想从一个可靠的来源引用一个引用,即将迭代器移到"一个接一个"的元素之外是未定义的行为.