Пусть этот массив списков:
set list(1) {hello hi bye lol rofl p1 p2 etc}
set list(2) {hello hi bye lol lmao c1 apple mango}
set list(3) {hello hi bye lol rofl p1 p2 etc mango chair table}
set list(4) {hello hi bye lol rofl p1 p2 etc bus mango apple etc}
Метод 1
set res {}
set allWords [lsort -unique [concat $list(1) $list(2) $list(3) $list(4)]]
foreach word $allWords {
set in {}
foreach i {1 2 3 4} {
if {$word in $list($i)} {
lappend in $i
}
}
lappend res $word $in
}
Алгоритм: создать список всех уникальных слов. Для каждого такого слова записывайте, если он встречается в каждом из списков в массиве. Верните список четных размеров, где пункт 0, 2, ... - это слово, а пункт 1, 3, ... - это номера списков, в которых встречается слово.
Метод 2
set res [concat {*}[lmap word $allWords {
list $word [lmap i {1 2 3 4} {
if {$word in $list($i)} {
set i
} else {
continue
}
}]
}]]
По существу то же самое, но использует 8.6 lmap
команду Tcl.
Метод 3
unset res
foreach i {1 2 3 4} {
foreach word $list($i) {
dict lappend res $word $i
}
}
алгоритм: для каждого списка и слова, lappend
список номер к элементу в словаре res
с ключом $word
. Примечание: Это решение имеет недостаток, что если слово происходит более одного раза в одном списке, номер списка - lappend
ed несколько раз.
Prettyprinting результат
lsort -unique
из-за слабости в способе 3: это не является необходимым для других методов.
proc prettyPrint {word in} {
set in [lsort -unique $in]
switch [llength $in] {
0 {}
1 {
puts "$word is in list $in"
}
2 {
puts "$word is in list [join $in { and }]"
}
3 {
puts "$word is in lists [join $in {, }]"
}
4 {
puts "$word is in all lists"
}
}
}
foreach {w i} $res {
prettyPrint $w $i
}
(Список будет напечатан в другом порядке (слово для вставки заказа), если метод 3 используется.)
apple is in list 2 and 4
bus is in list 4
bye is in all lists
c1 is in list 2
chair is in list 3
etc is in lists 1, 3, 4
hello is in all lists
hi is in all lists
lmao is in list 2
lol is in all lists
mango is in lists 2, 3, 4
p1 is in lists 1, 3, 4
p2 is in lists 1, 3, 4
rofl is in lists 1, 3, 4
table is in list 3
Документация: concat, continue, dict, foreach, if, lappend, list, llength, lmap, lmap замена, lsort, proc, set, switch, unset
Я не использую C++. Любой алгоритм может мне помочь – Nitesh