获取 for 循环中的所有其他索引
get every other index in for loop
我有一个有趣的问题。我有一个位于 html 中的字符串,我需要解析一个 table 以便我可以从 table 中获取我需要的数据并以一种在移动设备。所以我使用正则表达式并且它工作得很好但现在我正在将我的代码移植到使用 Kotlin 并且我拥有的解决方案不能很好地移植。以下是目前的解决方案:
var pointsParsing = Regex.Matches(htmlBody, "<td.*?>(.*?)</td>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
var pointsSb = new StringBuilder();
for (var i = 0; i < pointsParsing.Count; i+= 2)
{
var pointsTitle = pointsParsing[i].Groups[1].Value.Replace("&", "&");
var pointsValue = pointsParsing[i+1].Groups[1].Value;
pointsSb.Append($"{pointsTitle} {pointsValue} {pointsVerbiage}\n");
}
return pointsSb.ToString();
如您所见,循环中的每个 运行 我从正则表达式搜索中得到两个结果,因此我告诉 for 循环递增 2 以避免冲突。
但是我在 Kotlin 中似乎没有这种能力,我知道如何在 for 循环中获取索引,但不知道如何告诉它跳过 2,所以我不会不小心得到我想要的东西已在最后一圈解析。
我如何告诉 for 循环在 Kotlin 中按照我需要的方式工作?
我找到了一个看起来可行的解决方案并认为我会分享。
感谢 所以回答我知道你如何跳过索引。
val pointsListSearch = "<td.*?>(.*?)</td>".toRegex()
val pointsListSearchResults = pointsListSearch.findAll(htmlBody)
val pointsSb = StringBuilder()
val ptsListResults = pointsListSearchResults.toList()
for (i in ptsListResults.indices step 2)
{
val pointsTitle = ptsListResults[i].groups[1]!!.value
val pointsValue = ptsListResults[i+1].groups[1]!!.value
pointsSb.append("${pointsTitle}: ${pointsValue}")
}
您可能正在寻找 chunked
,它可以让您将可迭代对象拆分成块,例如2 个元素:
ptsListResults.chunked(2).forEach { data -> // data is a list of (up to) two elements
val pointsTitle = data[0].groups[1]!!.value
val pointsValue = data[1].groups[1]!!.value
// etc
}
因此,将您的列表分成有意义的块,并在这些块的结构内操作,而不是操纵索引,这更明确。
还有 windowed
,它有点复杂,为您提供了更多选择,其中之一是不允许部分 windows(即末尾没有所需数量的块元素)。可能不适用于此处,但您知道的就是这样!
我有一个有趣的问题。我有一个位于 html 中的字符串,我需要解析一个 table 以便我可以从 table 中获取我需要的数据并以一种在移动设备。所以我使用正则表达式并且它工作得很好但现在我正在将我的代码移植到使用 Kotlin 并且我拥有的解决方案不能很好地移植。以下是目前的解决方案:
var pointsParsing = Regex.Matches(htmlBody, "<td.*?>(.*?)</td>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
var pointsSb = new StringBuilder();
for (var i = 0; i < pointsParsing.Count; i+= 2)
{
var pointsTitle = pointsParsing[i].Groups[1].Value.Replace("&", "&");
var pointsValue = pointsParsing[i+1].Groups[1].Value;
pointsSb.Append($"{pointsTitle} {pointsValue} {pointsVerbiage}\n");
}
return pointsSb.ToString();
如您所见,循环中的每个 运行 我从正则表达式搜索中得到两个结果,因此我告诉 for 循环递增 2 以避免冲突。
但是我在 Kotlin 中似乎没有这种能力,我知道如何在 for 循环中获取索引,但不知道如何告诉它跳过 2,所以我不会不小心得到我想要的东西已在最后一圈解析。
我如何告诉 for 循环在 Kotlin 中按照我需要的方式工作?
我找到了一个看起来可行的解决方案并认为我会分享。
感谢
val pointsListSearch = "<td.*?>(.*?)</td>".toRegex()
val pointsListSearchResults = pointsListSearch.findAll(htmlBody)
val pointsSb = StringBuilder()
val ptsListResults = pointsListSearchResults.toList()
for (i in ptsListResults.indices step 2)
{
val pointsTitle = ptsListResults[i].groups[1]!!.value
val pointsValue = ptsListResults[i+1].groups[1]!!.value
pointsSb.append("${pointsTitle}: ${pointsValue}")
}
您可能正在寻找 chunked
,它可以让您将可迭代对象拆分成块,例如2 个元素:
ptsListResults.chunked(2).forEach { data -> // data is a list of (up to) two elements
val pointsTitle = data[0].groups[1]!!.value
val pointsValue = data[1].groups[1]!!.value
// etc
}
因此,将您的列表分成有意义的块,并在这些块的结构内操作,而不是操纵索引,这更明确。
还有 windowed
,它有点复杂,为您提供了更多选择,其中之一是不允许部分 windows(即末尾没有所需数量的块元素)。可能不适用于此处,但您知道的就是这样!