1
A
回答
1
這可以通過複製列表來完成,同時確保前兩個元素與要複製的元素不同。如果是,則放棄前兩個元素,否則按照正常方式複製。
這可以用inject
實現這樣的:
def list = [4,1,1,1,3,5,1,1]
def result = list.drop(2).inject(list.take(2)) { result, element ->
def prefixSize = result.size() - 2
if ([element] * 2 == result.drop(prefixSize)) {
result.take(prefixSize)
} else {
result + element
}
}
assert result == [4,3,5,1,1]
0
您可以在接下來的三個要素計算的唯一身份尺寸和墨滴他們時,他們是1:
def list = [4,1,1,1,3,5,1,1]
assert removeTriplets(list) == [4,3,5,1,1]
def removeTriplets(list) {
listCopy = [] + list
(list.size()-3).times { index ->
uniques = list[index..(index+2)].unique false
if (uniques.size() == 1)
listCopy = listCopy[0..(index-1)] + listCopy[(index+3)..-1]
}
listCopy
}
0
另一種選擇是使用Run Length Encoding
首先讓我們定義一個類,它將保存我們的對象和它在一行中出現的次數:
class RleUnit {
def object
int runLength
RleUnit(object) {
this(object, 1)
}
RleUnit(object, int runLength) {
this.object = object
this.runLength = runLength
}
RleUnit inc() {
new RleUnit(object, runLength + 1)
}
String toString() { "$object($runLength)" }
}
然後我們就可以定義將列表編碼爲RleUnit
對象的列表的方法:
List<RleUnit> rleEncode(List list) {
list.inject([]) { r, v ->
if(r && r[ -1 ].object == v) {
r.take(r.size() - 1) << r[ -1 ].inc()
}
else {
r << new RleUnit(v)
}
}
}
而這需要RleUnit
對象的名單,並拆包回原來的方法清單:
List rleDecode(List<RleUnit> rle) {
rle.inject([]) { r, v ->
r.addAll([ v.object ] * v.runLength)
r
}
}
然後,我們可以編碼原始列表:
def list = [ 4, 1, 1, 1, 3, 5, 1, 1 ]
rle = rleEncode(list)
並與Groovy的find方法篩選此RleUnit列表:
// remove all elements with a runLength of 3
noThrees = rle.findAll { it.runLength != 3 }
unpackNoThrees = rleDecode(noThrees)
assert unpackNoThrees == [ 4, 3, 5, 1, 1 ]
// remove all elements with a runLength of less than 3
threeOrMore = rle.findAll { it.runLength >= 3 }
unpackThreeOrMore = rleDecode(threeOrMore)
assert unpackThreeOrMore == [ 1, 1, 1 ]
相關問題
- 1. 在Ruby陣列刪除連續重複
- 2. 僅刪除連續的重複行
- 3. MySQL:刪除連續的重複值
- 4. 快速刪除連續重複python
- 5. 刪除元組中的連續重複
- 6. perl刪除連續的重複行
- 7. MySQL的刪除重複的連續行
- 8. 刪除重複的連續對象
- 9. 刪除連續的字母重複
- 10. 刪除連續的重複條目
- 11. 去除連續重複值
- 12. 陣列 - 找對象重複進行幾次連續
- 13. awk substr連續幾次
- 14. RadGrid連續顯示值兩次(重複)?
- 15. 刪除與幾列重複,總結其他列
- 16. Excel VBA - 消除連續的重複項
- 17. 通過去除連續的重複
- 18. 消除連續重複列表元素
- 19. 如何消除連續的重複值
- 20. MySQL刪除後續重複操作
- 21. Python - 如何刪除重複只有在字符串中連續?
- 22. Excel VBA - 刪除連續內的重複項
- 23. 如何從列表中刪除連續的重複項?
- 24. 刪除MySQL中連續重複行的有效方法
- 25. 刪除重複連續從列表中的Prolog
- 26. 刪除字符串中的連續重複單詞
- 27. 在C++中刪除字符串中的連續重複字符
- 28. 刪除連續重複的值,但如果R中
- 29. 根據列刪除連續的重複行
- 30. 使用XSLT刪除連續的重複記錄
我相信你可以使用'list.collate(3,1)'以及 –