保持List有序

要使用List<T>的BinarySearch方法定期在List<T>中搜索特定元素。元素的增加,修改和删除与搜索交替进行。不过,使用BinarySearch方法的前提是:这是个有序组;如果List<T>不是有序的,BinarySearch可能返回不正确的结果。如果调用List<T>.BinarySearch方法之前总是要记住调用List<T>.Sort方法,此方法会带来很多开销,需要一种办法让List<T>保持有序,而不总是调用List<T>.Sort方法。

using  System;
    
using  System.Collections;
    
using  System.Collections.Generic;

    
public   class  SortedList < T >  : List < T >
    
{
        
public void AddSorted(T item)
        
{
            
int position = this.BinarySearch(item);
            
if (position < 0)
            
{
                
//在下述的文中讲述这部分代码.
                position = ~position;
            }


            
this.Insert(position, item);
        }


        
public void ModifySorted(T item, int index)
        
{
            
this.RemoveAt(index);

            
int position = this.BinarySearch(item);
            
if (position < 0)
            
{
                position 
= ~position;
            }


            
this.Insert(position, item);
        }

    }


上述代码中使用位反操作符~来确定这个项要放在这个有序表中时应该放在的位置。
关键一点是上面的 this.BinarySearch(value)函数的返回值。在MSDN中这样解释此函数的返回值:如果找到 value,则为指定 array 中的指定 value 的索引。如果找不到 value 且 value 小于 array 中的一个或多个元素,则为一个负数,该负数是大于 value 的第一个元素的索引的按位求补。如果找不到 value 且 value 大于 array 中的任何元素,则为一个负数,该负数是(最后一个元素的索引加 1)的按位求补。


以下测试代码
class  CTest
    
{
        
static void Main( )
        
{
            
// Create a SortedList and populate it with
            
// randomly chosen numbers.
            SortedList<int> sortedAL = new SortedList<int>( );
            sortedAL.AddSorted(
200);
            sortedAL.AddSorted(
20);
            sortedAL.AddSorted(
2);
            sortedAL.AddSorted(
7);
            sortedAL.AddSorted(
10);
            sortedAL.AddSorted(
0);
            sortedAL.AddSorted(
100);
            sortedAL.AddSorted(
-20);
            sortedAL.AddSorted(
56);
            sortedAL.AddSorted(
55);
            sortedAL.AddSorted(
57);
            sortedAL.AddSorted(
200);
            sortedAL.AddSorted(
-2);
            sortedAL.AddSorted(
-20);
            sortedAL.AddSorted(
55);
            sortedAL.AddSorted(
55);

            
// Display it.
            foreach (int i in sortedAL)
            
{
                Console.WriteLine(i);
            }


            
// Now modify a value at a particular index.
            sortedAL.ModifySorted(05);
            sortedAL.ModifySorted(
110);
            sortedAL.ModifySorted(
211);
            sortedAL.ModifySorted(
37);
            sortedAL.ModifySorted(
42);
            sortedAL.ModifySorted(
24);
            sortedAL.ModifySorted(
150);
            sortedAL.ModifySorted(
015);
            sortedAL.ModifySorted(
22315);

            
// Display it.
            Console.WriteLine( );
            
foreach (int i in sortedAL)
            
{
                Console.WriteLine(i);
            }

        }

    }


在以上的代码中写了2个函数 AddSorted和 ModifySorted,这两个函数分别代表添加和修改。至于删除操作不会破坏剩余项的有序性。只有添加和删除会对其进行影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将列表转换为集合后再转换回列表,会保留原有的顺序。 例如: ``` my_list = [1, 2, 3, 4, 5] my_set = set(my_list) my_list = list(my_set) print(my_list) ``` 输出结果为: ``` [1, 2, 3, 4, 5] ``` 这是因为集合是无序的,在将它转换回列表时会保留原有的顺序。 ### 回答2: list to set to list 保持顺序的方式是使用有序集合,即使用collections模块中的OrderedDict类来实现。 列表(list)是有序的,集合(set)是无序的,因此想要保持顺序,我们可以先将列表转化为有序集合,再将有序集合转化回列表。 步骤如下: 1. 首先导入collections模块中的OrderedDict类。 ```python from collections import OrderedDict ``` 2. 将列表转化为有序集合。 ```python original_list = [1, 2, 3, 4, 5] ordered_set = OrderedDict.fromkeys(original_list) ``` 3. 将有序集合转化回列表。 ```python new_list = list(ordered_set.keys()) ``` 最终得到的new_list就是保持了原始顺序的列表。 ### 回答3: 要实现list到set再到list的过程中保持顺序,可以使用Python中的有序集合模块collections中的OrderedDict类。 首先,将列表转换为有序字典。有序字典是Python中的一个内置类,可以根据插入的顺序保存键值对。可以使用collections模块中的OrderedDict函数来创建有序字典,并将列表中的元素作为键插入有序字典中,值设置为None。 然后,再将有序字典转换为列表。使用有序字典的keys()方法可以获取有序字典的键,并转换为列表。 以下是使用OrderedDict类实现list到set再到list过程中保持顺序的示例代码: ```python from collections import OrderedDict def list_to_set_to_list(lst): # 将列表转换为有序字典 ordered_dict = OrderedDict.fromkeys(lst) # 将有序字典的键转换为列表 result = list(ordered_dict.keys()) return result ``` 示例调用: ```python lst = [3, 2, 1, 2, 3] result = list_to_set_to_list(lst) print(result) # 输出:[3, 2, 1] ``` 在上述示例中,输入的列表是[3, 2, 1, 2, 3]。经过list_to_set_to_list函数处理后,输出的列表是[3, 2, 1],保持了原列表的顺序。 这是因为有序字典会根据元素插入的顺序来保存键值对,而转换为列表后,列表的顺序有序字典的插入顺序一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值