Из Вашего ответа:
$("a[0]")
не допустимый селектор. получить первое на использовании страницы:
$("a:first")
или
$("a").eq(0).
Так для селектора в Вашем ответе:
$("table[1]/tr[1]/td[1]/a").trigger('click');
запись
$("table").eq(1).children("tr").eq(1).children('td').eq(1).children('a').click();
Примечание, как это нажмет на все ссылки во второй ячейке таблицы второй строки таблицы во второй таблице на Вашей странице.
при использовании этого метода для перенаправления страницы к href следующий метод немного более хорош:
document.location = $("table").eq(1).children("tr").eq(1).children('td').eq(1).children('a').attr('href');
Примечание, как это установит местоположение документа на href первого найденный во второй ячейке таблицы второй строки таблицы, найденной во второй таблице на странице.
, Если Вы хотите соответствовать первому использованию элементов eq (0) вместо eq (1).
РЕДАКТИРОВАНИЕ
, Если Вы действительно хотите сделать это 1337-haxxor
$("table:eq(1) > tr:eq(1) > td:eq(1) > a").click();
однако, я думаю, что другой метод является большим количеством readible.
РЕДАКТИРОВАНИЕ
Хорошо, от Вас затем отвечают/подвергают сомнению на штуку
Как насчет того, чтобы не на самом деле нажать на ссылку, но просто установить строку document.location на него:
document.location = $("table").eq(0).children("tr").eq(0).children('td').eq(0).children('a').eq(0).attr('href');
Вам нужен powerset. Вот все вопросы по StackOverflow, в которых упоминаются наборы мощности или наборы мощности .
Вот базовая реализация на python:
def powerset(s):
n = len(s)
masks = [1<<j for j in xrange(n)]
for i in xrange(2**n):
yield [s[j] for j in range(n) if (masks[j] & i)]
if __name__ == '__main__':
for elem in powerset([1,2,3,4,5]):
print elem
И вот его результат:
[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
[4]
[1, 4]
[2, 4]
[1, 2, 4]
[3, 4]
[1, 3, 4]
[2, 3, 4]
[1, 2, 3, 4]
[5]
[1, 5]
[2, 5]
[1, 2, 5]
[3, 5]
[1, 3, 5]
[2, 3, 5]
[1, 2, 3, 5]
[4, 5]
[1, 4, 5]
[2, 4, 5]
[1, 2, 4, 5]
[3, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
Примечание что его первый результат - пустой набор. Измените итерацию с этого для i в xrange (2 ** n):
на это для i в xrange (1, 2 ** n):
, если вы хотите пропустить пустой set.
Вот код, адаптированный для вывода строки:
def powerset(s):
n = len(s)
masks = [1<<j for j in xrange(n)]
for i in xrange(2**n):
yield "".join([str(s[j]) for j in range(n) if (masks[j] & i)])
Edit 2009-10-24
Хорошо, я вижу, вы неравнодушны к реализации на Java. Я не знаю Java, поэтому пойду на полпути и дам код на C #:
static public IEnumerable<IList<T>> powerset<T>(IList<T> s)
{
int n = s.Count;
int[] masks = new int[n];
for (int i = 0; i < n; i++)
masks[i] = (1 << i);
for (int i = 0; i < (1 << n); i++)
{
List<T> newList = new List<T>(n);
for (int j = 0; j < n; j++)
if ((masks[j] & i) != 0)
newList.Add(s[j]);
yield return newList;
}
}
В C ++ задана следующая процедура:
template <typename Iterator> bool next_combination(const Iterator first, Iterator k, const Iterator last) { /* Credits: Mark Nelson http://marknelson.us */ if ((first == last) || (first == k) || (last == k)) return false; Iterator i1 = first; Iterator i2 = last; ++i1; if (last == i1) return false; i1 = last; --i1; i1 = k; --i2; while (first != i1) { if (*--i1 < *i2) { Iterator j = k; while (!(*i1 < *j)) ++j; std::iter_swap(i1,j); ++i1; ++j; i2 = k; std::rotate(i1,j,last); while (last != j) { ++j; ++i2; } std::rotate(k,i2,last); return true; } } std::rotate(first,k,last); return false; }
Затем вы можете выполнить следующее:
std::string s = "12345"; for(std::size_t i = 1; i <= s.size(); ++i) { do { std::cout << std::string(s.begin(),s.begin() + i) << std::endl; } while(next_combination(s.begin(),s.begin() + i,s.end())); }
Простейший алгоритм создания подмножеств набора размера N состоит в том, чтобы рассматривать все двоичные числа с использованием N битов. Каждая позиция в номере представляет собой элемент из набора. Если бит в числе равен 1, соответствующий элемент набора находится в подмножестве, в противном случае этот элемент не входит в подмножество. Поскольку биты в числе упорядочены, это сохраняет порядок исходного набора.
Ссылки:
используя python, модуль itertools определяет метод комбинаций (), который делает именно то, что вам нужно.
from itertools import *
list(combinations( '12345', 2 ))
даст вам:
[('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]
Для этого вы можете использовать следующий класс (в Java):
class Combinations {
String input;
StringBuilder cur;
private void next(int pos, int reminder) {
cur.append(input.charAt(pos));
if (reminder == 1) {
System.out.println(cur);
} else {
for (int i = pos + 1; i + reminder - 1 <= input.length(); i++)
next(i, reminder - 1);
}
cur.deleteCharAt(cur.length() - 1);
}
public void generate(String input) {
cur = new StringBuilder();
this.input = input;
for (int length = 1; length <= input.length(); length++)
for (int pos = 0; pos + length <= input.length(); pos++)
next(pos, length);
}
}
Для запуска вашего примера используйте следующий код:
new Combinations().generate("12345");
Порядок вывода такой же, как в примере. Не требуется хранить все подмножества, а затем сортировать их для получения описанного вами порядка.
Адриан Плиссон s answer показывает, как в Python извлекаются все подпоследовательности указанной длины (для произвольных типов данных последовательности). OP указывает, что он работает со строками и хочет всех подпоследовательностей. Таким образом, используя itertools.combinations
, мы определяем:
>>> from itertools import combinations
>>> def subseq_combos(inp):
... return (''.join(s) for r in range(len(inp) + 1) for s in combinations(inp, r))
...
>>> list(subseq_combos('12345'))
['', '1', '2', '3', '4', '5', '12', '13', '14', '15', '23', '24', '25', '34', '35', '45', '123', '124', '125', '134', '135', '145', '234', '235', '245', '345', '1234', '1235', '1245', '1345', '2345', '12345']
(Если пустая подпоследовательность должна быть опущена, используйте range (1, len (inp) + 1))
.)
Когда вы разветвляете
процесс, вы в основном получаете две (почти) точные копии процесса, и обе они продолжат работу.
Итак, что происходит. заключается в том, что сами дочерние элементы продолжают цикл в собственном пространстве процесса (после того, как они распечатывают свой вывод) , а также , как и родительский процесс. И, фактически, поскольку эти дети тоже разветвляются, внуки также будут продолжать жить с этого момента. Я уверен, что есть формула для определения того, сколько детей у вас в итоге будет (вероятно, что-то вроде N!), Но в данный момент у меня нет сил, чтобы это выяснить. Лучше использовать следующее решение.
Способ отличить родительский от дочернего - это возвращаемое значение из fork
.