С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
Sergej45
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 5
1

Удаление повторяющихся элементов в массиве

17.08.2012, 07:34. Просмотров 5513. Ответов 12
Метки нет (Все метки)

Здравствуйте. есть такая задача:
существует объект класса ArrayList в котором хранятся значения даты (12 июня 2012 г.)

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

Попробовал реализовать следующим образом, но метод возвращает массив без удаления дублирующихся значений
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
static object[] RemoveDouble(ArrayList ar)
        {
            
            string year = string.Empty;
            object[] array;
            string result;
            ArrayList yearArray = new ArrayList();
            
            foreach (string str in ar)
            {
                DateTime dt = DateTime.Parse(str);
                year = dt.Year.ToString();
                yearArray.Add(year);
            }
            
            yearArray.Sort();
            result = yearArray[0].ToString();
            
            for (int i = 1; i < ar.Count; i++)
            {
                if (result == yearArray[i].ToString())
                {
                    yearArray.RemoveAt(i);
                    result = yearArray[i].ToString();
                }
            }
            array = yearArray.ToArray();
            return array;
        }
Помогите найти ошибку пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2012, 07:34
Ответы с готовыми решениями:

Удаление повторяющихся элементов в массиве
Подскажите как реализовать удаление одинаковых чисел из массива? чем проще тем...

Подсчет и удаление повторяющихся строк в массиве
Здравствуйте, уважаемые форумчане. Требуется ваша помощь. Имеется массив с...

Удаление повторяющихся элементов в ArrayList
В цикле с помощью Add добавляю строки в массив ArrayList ArrayList temp = new...

Удаление повторяющихся элементов массива
Ребят, как можно вывести только неповторяющиеся элементы массива двумерного???...

Удаление повторяющихся элементов в ArrayList
Есть метод в котором открывается файл и далее происходит запись столбцов (но...

12
bob217
11 / 11 / 2
Регистрация: 06.12.2010
Сообщений: 33
17.08.2012, 07:50 2
просто для примера
years - исходный массив с годами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int i = 0; i<years.Lenght;i++)
{
   if(years[j]!="0")
  {
      for(int j = i+1;j<years.Lengt;j++)
      {
         if(years[i]==years[j])
         {
         years[j]=="0";
         }
      }
   }
}
for(int i = 0;i<years.Lenght;i++)
{
   if(years[i]!="0")
   {
      Console.WriteLine(years[i]); или newArrayYears.Add(years[i])
   }
}
не компилировал, но идея думаю понятная. данный метод подойдёт для не очень длинных массивов
0
sashk0
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
17.08.2012, 08:01 3
Если у вас массив ar, то не логичнее использовать не "i < ar.Count", а свойство lenght, т.е. i < ar.lenght ?

C#
1
2
3
4
5
6
7
8
for (int i = 1; i < ar.Count; i++)
            {
                if (result == yearArray[i].ToString())
                {
                    yearArray.RemoveAt(i);
                    result = yearArray[i].ToString();
                }
            }
Добавлено через 3 минуты
Цитата Сообщение от bob217 Посмотреть сообщение
просто для примера
years - исходный массив с годами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(int i = 0; i<years.Lenght;i++)
{
   for(int j = i+1;j<years.Lengt;j++)
   {
      if(years[i]==years[j])
      {
      years[j]=="0";
      }
   }
}
for(int i = 0;i<years.Lenght;i++)
{
   if(years[i]!="0")
   {
      Console.WriteLine(years[i]); или newArrayYears.Add(years[i])
   }
}
не компилировал, но идея думаю понятная. данный метод подойдёт для не очень длинных массивов
вот тут ошибка:
C#
1
2
3
4
if(years[i]==years[j])
{
years[j]=="0";
}
вы наверное имели ввиду
C#
1
2
3
4
if(years[i]==years[j])
{
years[j]="0";
}
0
Sergej45
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 5
17.08.2012, 08:06  [ТС] 4
Цитата Сообщение от sashk0 Посмотреть сообщение
Если у вас массив ar, то не логичнее использовать не "i < ar.Count", а свойство lenght, т.е. i < ar.lenght ?
На сколько я помню у объекта класса ArrayList нет такого свойства.
0
sashk0
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
17.08.2012, 08:09 5
Цитата Сообщение от Sergej45 Посмотреть сообщение
На сколько я помню у объекта класса ArrayList нет такого свойства.
Действительно, прошу прощения, не увидел сразу что это ArrayList
0
bob217
11 / 11 / 2
Регистрация: 06.12.2010
Сообщений: 33
17.08.2012, 08:11 6
sashk0, я просто написал идею, которая первая пришла в голову(пробежались по массиву, сверили грубо говоря, каждый с каждым, занулили повторяющиеся, и добавили в свеженький массив, или лист или, что то там ещё, незанулённые элементы, которые будут уникальные). и да, там будет присвоение, как вы верно подметили.
0
Sergej45
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 5
17.08.2012, 08:15  [ТС] 7
Цитата Сообщение от bob217 Посмотреть сообщение
sashk0, я просто написал идею, которая первая пришла в голову(пробежались по массиву, сверили грубо говоря, каждый с каждым, занулили повторяющиеся, и добавили в свеженький массив, или лист или, что то там ещё, незанулённые элементы, которые будут уникальные). и да, там будет присвоение, как вы верно подметили.
Да идея нормальная, но что вы имели ввиду написав, что данный метод подойдет для массивов небольшых размеров? Если массив будет большой ,то будет потеря в скорости?
0
sashk0
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
17.08.2012, 08:16 8
попробуйте так сделать

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
static object[] RemoveDouble(ArrayList ar)
        {
            
            string year = string.Empty;
            object[] array;
            string result;
            ArrayList yearArray = new ArrayList();
            
            foreach (string str in ar)
            {
                DateTime dt = DateTime.Parse(str);
                year = dt.Year.ToString();
                yearArray.Add(year);
            }
            
            yearArray.Sort();
            result = yearArray[0].ToString();
            
            foreach(int i in yearArray)
            {
                if (result == yearArray[i].ToString())
                {
                    result = yearArray[i].ToString();                    
                    yearArray.Remove(i);
                }
            }
            array = yearArray.ToArray();
            return array;
        }
0
bob217
11 / 11 / 2
Регистрация: 06.12.2010
Сообщений: 33
17.08.2012, 08:32 9
Цитата Сообщение от Sergej45 Посмотреть сообщение
Да идея нормальная, но что вы имели ввиду написав, что данный метод подойдет для массивов небольшых размеров? Если массив будет большой ,то будет потеря в скорости?
то, что если у тебя будет к примеру 10к элементов, то стоит придумать что то более оптимальное, ну а если 100 штук, то тут похрен на метод. хотя всегда нужно стремится к оптимальному решению)
0
Sergej45
0 / 0 / 0
Регистрация: 10.08.2012
Сообщений: 5
17.08.2012, 08:32  [ТС] 10
Цитата Сообщение от sashk0 Посмотреть сообщение
попробуйте так сделать


foreach(int i in yearArray)
ругается что указанное приведение является недопустимым
0
sashk0
67 / 67 / 7
Регистрация: 14.03.2012
Сообщений: 201
17.08.2012, 08:38 11
Цитата Сообщение от Sergej45 Посмотреть сообщение
ругается что указанное приведение является недопустимым
тогда foreach(var i in yearArray).

тут ещё наверное нужно перебор сделать не с i, а с i+1 элемента, т.к. мы уже записали значение нулевого элемента массива в переменную.
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
17.08.2012, 10:34 12
Sergej45, arraylist мне не нравится, поэтому покажу на примере List<DateTime>
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication15
{
    class Program
    {
        static void Main()
        {
            var list = new List<DateTime>();
            var k = DateTime.Now;
            for (int i = 0; i < 5; i++)
                list.Add(k);
            foreach (var dateTime in list)
                Console.WriteLine(dateTime.ToString());
            Console.WriteLine("\n\n");
            list = RemoveDoubles(list);
            foreach (var dateTime in list)
                Console.WriteLine(dateTime.ToString());
            Console.ReadKey();
        }
 
        public static List<T> RemoveDoubles<T>(List<T> list)
        {
            var set = new HashSet<T>();
            foreach (var value in list)
                set.Add(value);
            return set.ToList();
        }
    }
}
1
Moldir95
1 / 1 / 0
Регистрация: 26.02.2015
Сообщений: 21
01.04.2015, 15:44 13
сделайте мне пожалуйста такой же код для нелинейного списка
0
01.04.2015, 15:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2015, 15:44

Удаление повторяющихся элементов из xml файла
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;head&gt; &lt;element id=&quot;0&quot;&gt; ...

Удаление повторяющихся элементов в List<string>
private List&lt;string&gt; _teachers; public List&lt;string&gt; teachers ...

Удаление повторяющихся элементов из списка(найти ошибку)
Всем привет! Прошу помощи, надо написать функцию удаления всех повторяющихся...


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

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

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