Как правильно вернуть ArrayList < Object > из рекурсивного метода без повторных значений?

Как упоминалось выше, Peter, если у вас уже есть .cur-файл, вы можете использовать его как внедренный ресурс, создав фиктивный элемент в разделе ресурсов, а затем ссылаясь на курсор фикчирования, когда вам это нужно.

Например, вы хотите отображать нестандартные курсоры в зависимости от выбранного инструмента.

Добавить в ресурсы:

<Window.Resources>
    <ResourceDictionary>
        <TextBlock x:Key="CursorGrab" Cursor="Resources/Cursors/grab.cur"/>
        <TextBlock x:Key="CursorMagnify" Cursor="Resources/Cursors/magnify.cur"/>
    </ResourceDictionary>
</Window.Resources>

Пример встроенного курсора, на который ссылается код:

if (selectedTool == "Hand")
    myCanvas.Cursor = ((TextBlock)this.Resources["CursorGrab"]).Cursor;
else if (selectedTool == "Magnify")
    myCanvas.Cursor = ((TextBlock)this.Resources["CursorMagnify"]).Cursor;
else
    myCanvas.Cursor = Cursor.Arrow;

-Ben

1
задан lukasz4585621 18 January 2019 в 08:51
поделиться

1 ответ

Вы задаетесь вопросом, почему он печатает его нормально, в то время как возвращаемый список, кажется, имеет точно такой же массив в каждой позиции.
Это потому, что это точно такой же массив (та же ссылка на тот же объект). Поскольку в вашем решении вы используете только один массив, при вызове allResults.add(result) вы добавляете ссылку на ваш единственный массив в списке. Затем вы продолжаете изменять его, когда вы ищете другие комбинации. Вот почему ваш список содержит только последнюю найденную комбинацию.

Решением этой проблемы является добавление нового массива каждый раз, когда вы находите комбинацию, путем добавления копии вашего текущего массива в список. Просто замените

allResults.add(result);

на

allResults.add(Arrays.copyOf(result, result.length));

Таким образом, каждый элемент вашего списка указывает на отдельный массив.

0
ответ дан Ricola 18 January 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: