Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
1

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

25.10.2012, 13:27. Показов 485. Ответов 3
Метки нет (Все метки)

Добрый день.
Мне нужен класс, который умеет делать формировать цепочки элементов по набору пар.
Например: на вход даны пары (1, 2), (3, 6), (4, 5), (2, 3). После обработки должно получится две цепочки: (1, 2, 3, 6) и (4, 5).
Есть ли в .Net что-нибудь похожее?
0
Заказывайте контрольные, курсовые и дипломы здесь.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2012, 13:27
Ответы с готовыми решениями:

Класс который умеет выполнять логические операции над битами
Задача : Опишите класс который умеет выполнять логические операции над битами. (конъюнкция,...

Написать класс Queue (очередь), который умеет хранить следующие данные
Добрый вечер дорогие программисты) Не давно на вашем форуму, очень многое и интересное узнал у Вас....

По заданному набору доминошек определите, сколько пар «дружных доминошек» можно составить из него
Проводя генеральную уборку на дачном чердаке, Саша нашел в комоде кучу доминошек из разных наборов....

Какой компонент умеет делать такое?
Надо выбирать элементы из одного списка и добавлять в другой. Как на картинке.

3
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
25.10.2012, 15:06 2
Возможно Union можно написать и быстрее - лень думать:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
namespace ConsoleApplication
{
    internal class Program
    {
        private static void Main()
        {
            var chains = new List<Chain>
                {
                    new Chain("(1, 2)"),
                    new Chain("(3, 6)"),
                    new Chain("(4, 5)"),
                    new Chain("(2, 3)"),
                    new Chain("(9, 1)"),
                    new Chain("(0, 4)")
                };
            Chain.Union(chains);
            chains.ForEach(Console.WriteLine);
        }
    }
 
    internal class Chain
    {
        private int[] data;
 
        public Chain(string text)
        {
            var match = Regex.Match(text, @"\((?:(\d+)(?:,? *)?)+\)", RegexOptions.Compiled);
            if (!match.Success)
                throw new ArgumentException("Неправильный формат строки.", "text");
            var captures = match.Groups[1].Captures;
            data = new int[captures.Count];
            for (var i = 0; i < captures.Count; i++)
                data[i] = int.Parse(captures[i].Value);
        }
 
        private int First
        {
            get { return data[0]; }
        }
 
        private int Last
        {
            get { return data[data.Length - 1]; }
        }
 
        private int Count
        {
            get { return data.Length; }
        }
 
        public static void Union(List<Chain> chains)
        {
            for (var i = 0; i < chains.Count - 1; i++)
                for (var j = i + 1; j < chains.Count; j++)
                    if (chains[i].Last == chains[j].First)
                    {
                        Union(chains[i], chains[j]);
                        chains.Remove(chains[j]);
                        j = i;
                    }
                    else if (chains[i].First == chains[j].Last)
                    {
                        Union(chains[j], chains[i]);
                        chains.Remove(chains[i]);
                        j = i;
                    }
        }
 
        private static void Union(Chain left, Chain right)
        {
            var data = new int[left.Count + right.Count - 1];
            Array.Copy(left.data, data, left.Count);
            Array.Copy(right.data, 1, data, left.Count, right.Count - 1);
            left.data = data;
        }
 
        public override string ToString()
        {
            return string.Format("({0})", string.Join(", ", data));
        }
    }
}
1
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
25.10.2012, 15:30  [ТС] 3
I2um1, спасибо за ответ. Правда, мне хотелось узнать про что-нибудь уже готовое дотнетовское. Я и сама уже написала. Вот, может быть, кому пригодится:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    public class ChainSet<T> where T : IEquatable<T>
    {
        public void AddPair(T firstItem, T secondItem)
        {
            Chain<T> secondItemAddedTo = null;
            Chain<T> firstItemAddedTo = null;
            foreach (Chain<T> chain in _chains)
            {
                bool added = chain.TryAddPairToEnd(firstItem, secondItem);
                if (added)
                    secondItemAddedTo = chain;
                added = chain.TryAddPairToBegin(firstItem, secondItem);
                if(added)
                    firstItemAddedTo = chain;
            }
            if ((firstItemAddedTo == null) && (secondItemAddedTo == null))
            {
                _chains.Add(new Chain<T>(firstItem, secondItem));
            }
            else if ((firstItemAddedTo != null) && (secondItemAddedTo != null))
            {
                secondItemAddedTo.AddChainToEnd(firstItemAddedTo);
                _chains.Remove(firstItemAddedTo);
            }
        }
 
        public List<Chain<T>> GetAllChains()
        {
            return new List<Chain<T>>(_chains);
        }
 
        private List<Chain<T>> _chains = new List<Chain<T>>();
    }
 
    public class Chain<T> where T : IEquatable<T>
    {
        public Chain(T firstItem, T secondItem)
        {
            _items = new List<T>();
            _items.Add(firstItem);
            _items.Add(secondItem);
        }
 
        public bool TryAddPairToEnd(T firstItem, T secondItem)
        {
            if (_items.Last().Equals(firstItem))
            {
                _items.Add(secondItem);
                return true;
            }
            else
            {
                return false;
            }
        }
 
        public bool TryAddPairToBegin(T firstItem, T secondItem)
        {
            if (_items.First().Equals(secondItem))
            {
                _items.Insert(0, firstItem);
                return true;
            }
            else
            {
                return false;
            }
        }
 
        public bool AddChainToEnd(Chain<T> another)
        {
            List<T> anotherChainItems = another.GetItems();
            if (_items.Last().Equals(anotherChainItems.First()))
            {
                _items.AddRange(anotherChainItems.Skip(1));
                return true;
            }
            else
            {
                return false;
            }
        }
 
        public List<T> GetItems()
        {
            return new List<T>(_items);
        }
 
        private List<T> _items;
    }
1
6021 / 3428 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.10.2012, 16:17 4
Цитата Сообщение от Ereona Посмотреть сообщение
мне хотелось узнать про что-нибудь уже готовое дотнетовское
врядли есть что-то готовое, довольно специфичная задача. MS пишет ширпотреб
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2012, 16:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Определить предикат Р(List,Х) который истинен если Х состоит из пар элементов списка List,сумма которых больше половины элементов List
Помогите пожалуйста написать программу,буду очень благодарен,заранее спасибо! Определить предикат...

Кто умеет делать функциональную схему? по определённой игре?
Кто умеет делать функциональную схему? по определённой игре? Если чё саму игру скину

Видео карта умеет очень быстро делать компоновку финальной картинки, выводимой на экран
Задача не для написания в Паскале. Внимательно подумайте, удачи) Видео карта умеет очень быстро...

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


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

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

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