Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
1

Перебор списка и выборка на основе метода

29.01.2016, 19:23. Просмотров 382. Ответов 13
Метки нет (Все метки)

Прошу подсказать советом, в какую сторону копать или гуглить по форуму
Имеется 1000 точек. Предположим:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Point
{
     public Double X { get; set; }
     public Double Y { get; set; }
     public Double Z { get; set; }
 
     public Point(Double _x, Double _y, Double _z)
      {
          X = _x;
          Y = _y;
          Z = _z;
      }
}
В некоем цикле надо перебрать их все и на основании другого метода отсеять неподходящие.
Сортировка такая: берём первую точку, сравниваем со второй, условие не выполнено. Берём первую точку, сравниваем с третьей, условие выполнено => добавляем точки в результирующий массив и начинаем заново перебор с последней взятой, тоесть с третьей точкой: берем третью точку, сравниваем с четвертой, условие выполнено => добавляем четвёртую точку. И снова выборка, начиная с последней добавленной в результирующий массив.
Есть ли какие подходящие алгоритмы для такого?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2016, 19:23
Ответы с готовыми решениями:

Выборка списка таблиц из базы данных
SELECT * FROM sysobjects WHERE xtype='U' данная строка позваляет выбрать...

Перебор чисел и выборка определенных
есть 3 комплексных значения Аlfa и 3 значения Beta. Нужно выбрать по одному...

Перебор списка списков
Помогите перебрать список списков. Вот так я его формирую static private...

Перебор элементов списка
Что не так? Почему список списков не могу вывести? using System; using...

Классификатор спама на основе Метода Фишера
Здраствуйте, нужно мне нужно сделать классификатор спама на основе Метода...

13
insite2012
Модератор
Эксперт .NET
4858 / 3813 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.01.2016, 19:29 2
Цитата Сообщение от skilllab Посмотреть сообщение
условие
Условие всегда одно и то же? Вероятно что да, так почему бы не использовать LINQ и Where?
0
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
29.01.2016, 19:33  [ТС] 3
условие всегда одно и то же.

Ну вот начал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public void Sort(List<Point> points)
        {
            List<Point> resultArray = new List<Point>();
            Int32 i = 0;
            Int32 j = 1;
            while (i < 1000)
            {
                if (SomeSortingMethod(points[i], resultArray[j]))
                {
                    resultArray.Add(points[i]);
                    i++;
                    j++;
                }
                else
                {
                    //не знаю
                }
            }
        }
Добавлено через 1 минуту
Краем уха услышал что можно применить какое то красно-черное дерево. Туда ли копать?
0
insite2012
Модератор
Эксперт .NET
4858 / 3813 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.01.2016, 19:34 4
Цитата Сообщение от skilllab Посмотреть сообщение
можно применить какое то красно-черное дерево.
Так я не понял, чем штатные средства не подходят? Скорость не устраивает?
0
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
29.01.2016, 19:39  [ТС] 5
Да я даже не пойму как отсортировать (логика в коде) ))) Потому и пишу на форум.

Добавлено через 3 минуты
Т.е. каждая новая выборка (если условие выполнено) при переборе должна начинаться с той позиции, где закончилась предыдущая.
Каждая новая выборка (если условие не выполнено) должна сохранять начальную позицию и сравниваться с
i+1
пока не будет выполнено условие.
0
insite2012
Модератор
Эксперт .NET
4858 / 3813 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.01.2016, 19:47 6
skilllab, не пойму, зачем такие условия? Скорость штатного перебора не устраивает?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            List<Point> points = new List<Point> {
                new Point{X=1, Y=3, Z=3},
                new Point{X=0, Y=3, Z=3},
                new Point{X=1, Y=3, Z=3}
            };
            var result = points.Where(p => PointComparer(p));
        }
        static bool PointComparer(Point p) {
            //Тут условие выборки объекта...
            return true;
        }
    }
    class Point {
        public int X { get; set; }
        public int Y { get; set; }
        public int Z { get; set; }
    }
}
0
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
29.01.2016, 19:48  [ТС] 7
Берём точку A, сравниваем с B = >условие выполнено, добавляем B в результирующий лист. Новая выборка. Берем точку B сравниваем с С = > условие выполнено, добавляем в результирующий массив. Новая выборка. Берём точку С, сравниваем с D => условие не выполнено. Новая выборка. Берем точку С и сравниваем с E = > условие не выполнено. Новая выборка. Берем точку С и сравниваем с F => условие выполнено, добавляем в результирующий массив. Новая выборка....
0
Миниатюры
Перебор списка и выборка на основе метода  
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
29.01.2016, 19:52  [ТС] 8
Цитата Сообщение от insite2012 Посмотреть сообщение
зачем такие условия?
Я вот сейчас более наглядно описал. Ну...такие условия)))

Добавлено через 1 минуту
А, ну и точка A автоматом попадает в результирующий массив, как стартовая.

Добавлено через 1 минуту
Цитата Сообщение от insite2012 Посмотреть сообщение
PointComparer
в нём вся загвоздка. Туда нужно не по порядку точки посылать, а по определённой логике.
0
insite2012
Модератор
Эксперт .NET
4858 / 3813 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.01.2016, 20:11 9
Цитата Сообщение от skilllab Посмотреть сообщение
в нём вся загвоздка. Туда нужно не по порядку точки посылать, а по определённой логике.
Так определите ее, эту логику. Я же только прототип показал, я не знаю какой она должна быть, эта самая логика)))

Добавлено через 15 минут
skilllab, может еще вот так пойдет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            List<Point> points = new List<Point> {
                new Point{X=1, Y=3, Z=3},
                new Point{X=0, Y=3, Z=3},
                new Point{X=1, Y=3, Z=3}
            };
            List<Point> sorted = GetPoints(points, (p) => (p.X == 1 && p.Y == 3 && p.Z == 3)).ToList();            
        }
        static IEnumerable<Point> GetPoints(List<Point> points, Func<Point, bool> comparer) {
            foreach (Point pt in points) {
                if (comparer(pt)) {
                    yield return pt;
                }
            }
        }
    }
    class Point {
        public int X { get; set; }
        public int Y { get; set; }
        public int Z { get; set; }
    }
}
1
kolorotur
Эксперт .NET
10614 / 8795 / 2194
Регистрация: 17.09.2011
Сообщений: 15,066
Завершенные тесты: 1
29.01.2016, 22:37 10
Цитата Сообщение от skilllab Посмотреть сообщение
В некоем цикле надо перебрать их все и на основании другого метода отсеять неподходящие.
Сортировка такая: берём первую точку, сравниваем со второй, условие не выполнено. Берём первую точку, сравниваем с третьей, условие выполнено => добавляем точки в результирующий массив и начинаем заново перебор с последней взятой, тоесть с третьей точкой: берем третью точку, сравниваем с четвертой, условие выполнено => добавляем четвёртую точку. И снова выборка, начиная с последней добавленной в результирующий массив.
Есть ли какие подходящие алгоритмы для такого?
Цитата Сообщение от skilllab Посмотреть сообщение
Берём точку A, сравниваем с B = >условие выполнено, добавляем B в результирующий лист. Новая выборка. Берем точку B сравниваем с С = > условие выполнено, добавляем в результирующий массив. Новая выборка. Берём точку С, сравниваем с D => условие не выполнено. Новая выборка. Берем точку С и сравниваем с E = > условие не выполнено. Новая выборка. Берем точку С и сравниваем с F => условие выполнено, добавляем в результирующий массив. Новая выборка....
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IEnumerable<Point> Filter(IEnumerable<Point> source, Func<Point, Point, bool> compare)
{
   using (var iter = source.GetEnumerator())
   {
      Point pivot;
      if (iter.MoveNext()) 
         pivot = iter.Current;
      else 
         yield break;
 
      while (iter.MoveNext())
      {
         if (compare(pivot, iter.Current))
         {
            yield return iter.Current;
            pivot = iter.Current;
         }
      }
   }
}
Использование:
C#
1
2
List<Point> points = ...
List<Point> filteredList = Filter(points, SomeSortingMethod).ToList();
1
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
31.01.2016, 15:47  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
if (compare(pivot, iter.Current))
это сравнение по Object? Или по ссылке?

Сам Compare должен быть несколько хитрее. Ибо есть условие. И при новой выборке будет смещение.
0
kolorotur
Эксперт .NET
10614 / 8795 / 2194
Регистрация: 17.09.2011
Сообщений: 15,066
Завершенные тесты: 1
31.01.2016, 15:53 12
Цитата Сообщение от skilllab Посмотреть сообщение
это сравнение по Object? Или по ссылке?
Как реализуете.

Цитата Сообщение от skilllab Посмотреть сообщение
Сам Compare должен быть несколько хитрее. Ибо есть условие.
Compare — это ссылка на метод, которую вы передаете вместе с коллекцией. Как реализован метод сравнения — это уже ваше дело.

Цитата Сообщение от skilllab Посмотреть сообщение
И при новой выборке будет смещение.
Оно там есть.
0
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
31.01.2016, 16:27  [ТС] 13
Всё что показывал выше, суть верно. Задача у меня несколько другая. Я просто выше "упростил"
Пока есть только это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//Код не совсем корректен
public void Sort(List<Point> points)
        {
            List<Point> resultArray = new List<Point>();
            Int32 i = 0;
            Boolean firstTrue = false;
            Boolean secondTrue = false;
            while (i < 1000)
            {
                Point first = null;
                if (!firstTrue)
                {
                    first = points[i];
                }
 
                Point second = points[i + 1];
                Point third = points[i + 2];
                Point center = GetCircleCenter(first, second, third);
 
 
                if (SomeSortingMethod(first, center, second))
                {
                    resultArray.Add(first);
                    resultArray.Add(second);
                    firstTrue = true;
                }
                if (SomeSortingMethod(second, center, third))
                {
                    resultArray.Add(second);
                    resultArray.Add(third);
                    secondTrue = true;
                }
                if (firstTrue)
                {
                    i = i + 1;
                }
                if (secondTrue)
                {
                    i = i + 1;
                }
            }
        }
Теперь логика:
есть 1000 точек на кривой. Есть начальная (точка отсчёта, тоже лежит на кривой). Берём первую (А), вторую(B), третью точки(C). Ищем центр окружности(O). Далее посылаем в Compare A,O,B - если true = добавляем в resultArray обе точки. Посылаем в Compare B,O,C - если false ничего не делаем.
Теперь, если всё же хоть одну точку добавили, то новая выборка начинается уже с n+(кол-во true возвращённых Compare), т.е. смотря выше по тексту (не по коду, код лишь набросок), i = 2. Если бы оба Compare выдали бы true, то новая выборка пошла бы с i = i+2, и в resultArray попали бы точки B и C. Если бы Compare не вернул ничего, то начальное смещение было бы i = i+2 но в resultArray ничего бы не пошло.

Дам ещё картинку, что именно хочется
0
Миниатюры
Перебор списка и выборка на основе метода   Перебор списка и выборка на основе метода  
skilllab
210 / 184 / 50
Регистрация: 03.02.2011
Сообщений: 1,779
Записей в блоге: 1
Завершенные тесты: 1
31.01.2016, 17:46  [ТС] 14
Похоже, задача у меня в голове изначально не верно поставлена. Чересчур замудрёный алгоритм.
Бросаю пока это дело, буду по другому логику реализовывать. Спасибо откликнувшимся.
0
31.01.2016, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2016, 17:46

Реализация поиска на основе метода хеширования
Ребята, если кто знает где можно найти толковые примеры(листинги) с применением...

Генератор псевдослучайных чисел на основе конгруэнтного метода
Подскажите пожалуйста!Как на С # реализовать генератор псевдослучайных чисел на...

Стек на основе списка
Всем привет, нужна ваша помощь в решении следующей задачи: Из элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru