Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ArrayList - в цикле просмотр и удаление (Remove), ArrayList - в цикле просмотр и удаление  
V
    Опции темы
diadiavova
Дата 26.4.2013, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ansen @  26.4.2013,  00:43 Найти цитируемый пост)
Это использование меняет условие выбора для следующего элемента

Тут мне помнится ты указывал мне на то, что я не могу понять, что ты написал. Не сочти за труд, ткни носом в то самое место в твоих предыдущих постах, из которого можно было сделать вывод, что условие меняется? Уж не это ли мутное пояснение?
Цитата(ansen @  26.4.2013,  00:15 Найти цитируемый пост)
Непредсказуемость выбора определяют определенные значения  элементов списка.

Ты правда считаешь, что внятно сформулировал вопрос? smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ansen
Дата 26.4.2013, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.2.2003

Репутация: нет
Всего: нет



От абстрактного к конкретному.

Программно собрал коллекцию линий в виде экземпляров класса ESRI.ArcGIS.Geometry.IPointCollection Это продукт от ESRI ArcGIS 10.1. http://www.esri.com/
Расположены в коллекции эти экземпляры случайно УЖЕ. 
Беру первый и копирую в результирующую PointCollection, а затем в цикле, фрагмент которого приводил(внутри цикла делается  больше, но суть не меняется), нахожу экземпляр класса у которого первая или последняя точка совпадает с последней точкой в результирующей PointCollection и соответственно напрямую или в обратном порядке добавляю найденный к результату. И удаляю его.
И так до опустошения списка. 

Расписал весь алгоритм. А должен был сделать это для заказчика smile 

Судя по твоему времени у вас день, а мне спать пора - 20мин по полуночи...




Это сообщение отредактировал(а) ansen - 26.4.2013, 00:22
PM MAIL   Вверх
diadiavova
Дата 26.4.2013, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



ansen, я так понимаю, все эти точки образуют замкнутый контур, а отдельные коллекции точек - его фрагменты. Фрагменты не упорядочены и твоя задача собрать из этих фрагментов контур. Если так, то ты говорил совсем не это.
Вообще, задача интересная, но мне больше интересно решить ее в общем виде, чтобы было не важно что собирать(контур из фрагментов, пазл или молекулу ДНК к примеру), но при этом алгоритм сборки описывался бы один раз. 
Решение будет примерно следующим:

Для начала сформулируем задачу обобщенно. У нас есть неупорядоченное множество объектов типа T. Нам потребуется объединять такие объекты, в результате будут получаться объекты того же типа, но при этом мы не можем объединить два произвольных объекта, зато можем проверить возможность их объединения. Таким образом для этого типа объектов у нас определены две операции, назовем их CanConcat и Concat. Первая операция принимает два объекта типа T и возвращает булево значение, показывающее, можно ли объединить объекты. Вторая - принимает два аргумента типа T и возвращает результат их объединения.
Мы можем описать обобщенный алгоритм выполняющий объединение всей коллекции, но для этого нам надо будет реализовать операции проверки и объединения для каждого отдельного случая. Например в твоем случае проверка будет заключаться в наличии общих точек на концах, а объединение - в копировании элементов коллекций в новую коллекцию. Для других типов объектов операции будут другими. 
Вот функция, которая выполняет операцию объединения.
Код

    Function ConcatAll(Of T)(tlist As IList(Of T), 
                                           concatCondition As Func(Of T, T, Boolean), 
                                           concatOperation As Func(Of T, T, T)) As T
        Select Case tlist.Count
            Case 0
                Return Nothing
            Case 1
                Return tlist(0)
            Case Else
                Dim acc = tlist(0)
                tlist.RemoveAt(0)
                While tlist.Count > 0
                    Dim nextT = tlist.First(Function(x) concatCondition(acc, x))
                    acc = concatOperation(acc, nextT)
                    tlist.Remove(nextT)
                End While
                Return acc
        End Select
    End Function
Собственно весь алгоритм, которому посвящена тема реализован в ней. Поскольку у меня нет твоих точек, продемонстрирую работу функции на целочисленных массивах, которые надо объединить в правильную последовательность чисел, фрагменты которой мы имеем в виде коллекции.

Определяем операции CanConcat и Concat
Код

    Function CanConcatIA(ia1 As Integer(), ia2 As Integer()) As Boolean
        Return Math.Abs(ia1.First - ia2.First) = 1 OrElse
            Math.Abs(ia1.First - ia2.Last) = 1 OrElse
            Math.Abs(ia1.Last - ia2.First) = 1 OrElse
            Math.Abs(ia1.Last - ia2.Last) = 1
    End Function

    Function ConcatIA(ia1 As Integer(), ia2 As Integer()) As Integer()
        Dim l As New List(Of Integer)
        If Math.Abs(ia1.First - ia2.First) = 1 Then
            l.AddRange(ia1.Reverse)
            l.AddRange(ia2)
        ElseIf Math.Abs(ia1.First - ia2.Last) = 1 Then
            l.AddRange(ia2)
            l.AddRange(ia1)
        ElseIf Math.Abs(ia1.Last - ia2.First) = 1 Then
            l.AddRange(ia1)
            l.AddRange(ia2)
        ElseIf Math.Abs(ia1.Last - ia2.Last) = 1 Then
            l.AddRange(ia1)
            l.AddRange(ia2.Reverse)
        Else
            Throw New ArgumentException("Аргументы не могут быть объединены.")
        End If
        Return l.ToArray
    End Function


Далее создаем коллекцию фрагментов последовательности, обрабатываем нашей функцией и выводим на экран
Код

   Sub Main()
        Dim l As New List(Of Integer()) From {
            New Integer() {12, 11, 10},
            New Integer() {6, 5, 4},
            New Integer() {1, 2, 3},
            New Integer() {7, 8, 9}
            }

        For Each i In ConcatAll(l, AddressOf CanConcatIA, AddressOf ConcatIA)
            Console.Write("{0} ", i)
        Next
        Console.ReadKey()
    End Sub
Будет выведено

Код

12 11 10 9 8 7 6 5 4 3 2 1
Таким образом пазл собрался. Я так понимаю с точками надо было сделать что-то в этом роде.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.