如何给一个泛型有什么用的ArrayList排序

14:43 提问
android 怎么将一个ArrayList按照另一个ArrayList排序
我现在有一个ArrayList A和一个ArrayList B,想将A按照B中数据的顺序排序,应该怎么做?求速度最快的方法!
按赞数排序
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
ArrayList C=B;
ArrayList D=A;然后
for(int i ==0;i--){
for(int j=0;j&D的长度;j++){
if(C的i项不等于D的j项)
C的i项删除操作;
//最后把C给A
中间用一个map转一下行不行
我就是提个思路希望能解决你的问题
第一个for(int i =C的长度-1;i&=0;i--),上面打错了
首先要确定数组A和数组B的大小是相同的。
然后是数组A和数组B对应下标位置的数据存在一定的对应关系
最后就是按照数组B的规则来对数组A进行排列
我是这样理解你题目的意思:A和B中元素是同一个类TestClass类的实例,如果B是升序,那么A也要升序;如果B是降序,那么A也要降序。
Java的集合框架中有一个TreeSet泛型类,它可以按照默认或者自定义的排序规则对其中的元素进行排序;如果是默认排序,会按照TreeSet中元素实现的Comparable接口中的compareTo()方法排序;如果是自定义排序,则需要在实例化TreeSet对象时传入一个Comparator接口的实现用于排序。
TreeSet还提供了获取传入的Comparator接口实现的方法comparator()。
那么,解决你的问题:先让TestClass类实现Comparable接口,此接口决定元素在TreeSet中的顺序;再将A和B转换成TreeSet,TreeSet提供了带有集合参数的构造方法;这样,A和B的顺序都是升序或降序,而且后续向其中增加新的元素,也会按照Comparable接口提供的规则来排序。
如果不是我理解的这样,而是A和B中元素具有某种特殊的一一对应关系,比如学生的姓名和学号,那么可以将A、B用Map联系在一起,一个作为key,一个作为value,这样它们的顺序始终是一样的;并且,Map也有排序的实现类TreeMap,和TreeSet类似,TreeMap仅仅根据key来排序,也支持默认排序和自定义排序。
实际上,java中先有Map,然后将其中但key置为null,就成了Set。
其他相似问题下次自动登录
现在的位置:
& 综合 & 正文
[C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List,Dictionary,SortedList,
今天有空正好把泛型和非泛型集合类写了一个比较,并做了个的例程,可以比较清楚的理解它们概念和使用方法。
泛型与非泛型集合类在C#中是非常重要的一个基础概念,这里列一个表来进行对比:
非泛型集合类
泛型集合类
表示具有动态大小的对象数组
Dictionary&Tkey,Tvalue&
由键值对组成的集合
SortedList
SortedList&Tkey,Tvalue&
和字典相似但有排序功能的集合
表示标准的先进先出(FIFO)队列
后进先出(LIFO)队列,提供压入和弹出功能
泛型与非泛型集合类在概念和功能上各有不同,其中非泛型集合类在取出值时需要进行类型的转换操作,如果加入值类型会引起装箱和拆箱的操作,这会带来巨大的性能额外开销,如果掌握好泛型数组之后可以不再需要用非泛型的数组了,同时带来类型安全的好处并减少在值类型和引用类型之间的装箱和拆箱。
下面做一个例程来演示一下,
例程是顺手在WPF下做的,虽然不是C#winform,但差不多是一回事,界面就不贴了。
先做一个学生类:
public class student
public int Number { }
public string Name { }
public bool Sex { }
public student(int _number, string _name, bool _sex)
Number = _
public override string ToString()
return string.Format(“序号:{0},姓名:{1},性别:{2}“,
Number.ToString(), Name, Sex ? “男“ : “女“);
一、ArrayList与List&T&示例
ArrayList arrayStudents = new ArrayList();
List&student& listStudnets = new List&student&();
private void Button_Click(object sender, RoutedEventArgs e)
addData0();
showExemple0();
private void addData0()
arrayStudents.Add(new student(1, “小颗豆一“, true));
arrayStudents.Add(new student(3, “小颗豆二“, false));
arrayStudents.Add(new student(5, “小颗豆三“, true));
arrayStudents.Add(new student(2, “小颗豆四“, false));
arrayStudents.Add(new student(4, “小颗豆五“, true));
arrayStudents.Add(new student(6, “小颗豆六“, false));
arrayStudents.Add(“这里冒一个字符串,需要转换,如果这里是值类型还要进行装箱与拆箱,带来额外的开销!“);
listStudnets.Add(new student(1, “小颗豆一“, true));
listStudnets.Add(new student(3, “小颗豆二“, false));
listStudnets.Add(new student(5, “小颗豆三“, true));
listStudnets.Add(new student(2, “小颗豆四“, false));
listStudnets.Add(new student(4, “小颗豆五“, true));
listStudnets.Add(new student(6, “小颗豆六“, false));
private void showExemple0()
richTextBox1.AppendText(“——–ArrayList与List&T&示例——–rn“);
richTextBox1.AppendText(“——–非泛型数组的操作(需要强制转换)——–rn“);
foreach (var item in arrayStudents)
if (item is student)
richTextBox1.AppendText(item.ToString() + “rn“);
richTextBox1.AppendText((string)item + “rn“);
richTextBox1.AppendText(“——–泛型数组的操作(不需要强制转换)——–rn“);
foreach (var item in listStudnets)
richTextBox1.AppendText(item.ToString() + “rn“);
注意观察代码中ArrayList接收的值包括类和字符串,所以要有不同的强制转换,虽然正常运行,但这样带来了安全隐患,泛型集合不需要转换可以轻松调用学生类中自定义的.ToString(),运行效果如下图:
二、Hashtable与Dictionary&Tkey,Tvalue&示例
private void button1_Click(object sender, RoutedEventArgs e)
richTextBox1.Document.Blocks.Clear();
addData1();
showExemple1();
Hashtable hashSudents = new Hashtable();
Dictionary&string ,student& DictStudents = new Dictionary&string ,student&();
private void addData1()
hashSudents.Add(“序号1“, new student(1, “小颗豆一“, true));
hashSudents.Add(“序号2“, new student(3, “小颗豆二“, false));
hashSudents.Add(“序号3“, new student(5, “小颗豆三“, true));
hashSudents.Add(“序号4“, new student(2, “小颗豆四“, false));
hashSudents.Add(“序号5“, new student(4, “小颗豆五“, true));
hashSudents.Add(“序号6“, new student(6, “小颗豆六“, false));
DictStudents.Add(“序号1“, new student(1, “小颗豆一“, true));
DictStudents.Add(“序号2“, new student(3, “小颗豆二“, false));
DictStudents.Add(“序号3“, new student(5, “小颗豆三“, true));
DictStudents.Add(“序号4“, new student(2, “小颗豆四“, false));
DictStudents.Add(“序号5“, new student(4, “小颗豆五“, true));
DictStudents.Add(“序号6“, new student(6, “小颗豆六“, false));
private void showExemple1()
richTextBox1.AppendText(“——–Hashtable与Dictionary&Tkey,Tvalue&示例——–rn“);
richTextBox1.AppendText(“——–非泛型数组的操作(需要强制转换),注意顺序是特定的——rn“);
foreach (DictionaryEntry item in hashSudents)
richTextBox1.AppendText(item.Key.ToString() + ((student)item.Value).ToString() + “rn“);
richTextBox1.AppendText(“包含序号2=“ + hashSudents.ContainsKey(“序号2“).ToString() + “rn“);
richTextBox1.AppendText(“包含序号9=“ + hashSudents.ContainsKey(“序号9“).ToString() + “rn“);
richTextBox1.AppendText(“——–泛型数组的操作(不需要强制转换),顺序是原来的顺序—–rn“);
foreach (KeyValuePair&string, student& item in DictStudents)
richTextBox1.AppendText(item.Key.ToString() + item.Value.ToString() + “rn“);
richTextBox1.AppendText(“包含序号2=“ + DictStudents.ContainsKey(“序号2“).ToString() + “rn“);
richTextBox1.AppendText(“包含序号9=“ + DictStudents.ContainsKey(“序号9“).ToString() + “rn“);
注意,1)Hashtable不仅需要强制转换,由于它内部的特殊性,所得到的结果跟原序中的结果顺序是不一致的,在需要排序的时候会很麻烦,但Dictionary&Tkey,Tvalue&不仅不需要强制转换,而且顺序跟原序是一致的。
2)Hashtable和Dictionary&Tkey,Tvalue&都仍具有.ContainsKey(“序号2″);(检查是否包含某键值的项)的方法效率很高。
运行效果如图:
三、SortedList与SortedList&Tkey,Tvalue&示例
SortedList sortListStudents = new SortedList();
SortedList&int, student& sortStudents = new SortedList&int, student&();
private void button2_Click(object sender, RoutedEventArgs e)
richTextBox1.Document.Blocks.Clear();
addData2();
showExemple2();
private void addData2()
sortListStudents.Add(50, new student(1, “小颗豆一“, true));
sortListStudents.Add(20, new student(3, “小颗豆二“, false));
sortListStudents.Add(80, new student(5, “小颗豆三“, true));
sortListStudents.Add(65, new student(2, “小颗豆四“, false));
sortListStudents.Add(44, new student(4, “小颗豆五“, true));
sortListStudents.Add(99, new student(6, “小颗豆六“, false));
sortStudents.Add(50, new student(1, “小颗豆一“, true));
sortStudents.Add(20, new student(3, “小颗豆二“, false));
sortStudents.Add(80, new student(5, “小颗豆三“, true));
sortStudents.Add(65, new student(2, “小颗豆四“, false));
sortStudents.Add(44, new student(4, “小颗豆五“, true));
sortStudents.Add(99, new student(6, “小颗豆六“, false));
private void showExemple2()
richTextBox1.AppendText(“——–SortedList与SortedList&Tkey,Tvalue&示例——–rn“);
richTextBox1.AppendText(“——–非泛型数组的操作(需要强制转换)———rn“);
foreach (DictionaryEntry item in sortListStudents )
richTextBox1.AppendText(item.Key.ToString() + ((student)item.Value).ToString() + “rn“);
richTextBox1.AppendText(“——–泛型数组的操作(不需要强制转换)——–rn“);
foreach (KeyValuePair &int,student & item in sortStudents )
richTextBox1.AppendText(item.Key.ToString() + item.Value.ToString() + “rn“);
在这个例程中,两个集合类工作都很好的实现了排序功能,差别仍是一个有强制转换,一个不需要。运行效果如图:
四、Queue与Queue&T&示例(先进先出)
Queue queueStuds = new Queue();
Queue &student & queueStudents=new Queue&student& ();//先进先出
private void button3_Click(object sender, RoutedEventArgs e)
richTextBox1.Document.Blocks.Clear();
addData3();
showExemple3();
private void addData3()
queueStuds.Enqueue(new student(1, “小颗豆一“, true));
queueStuds.Enqueue(new student(3, “小颗豆二“, false));
queueStuds.Enqueue(new student(5, “小颗豆三“, true));
queueStuds.Enqueue(new student(2, “小颗豆四“, false));
queueStuds.Enqueue(new student(4, “小颗豆五“, true));
queueStuds.Enqueue(new student(6, “小颗豆六“, false));
queueStudents.Enqueue(new student(1, “小颗豆一“, true));
queueStudents.Enqueue(new student(3, “小颗豆二“, false));
queueStudents.Enqueue(new student(5, “小颗豆三“, true));
queueStudents.Enqueue(new student(2, “小颗豆四“, false));
queueStudents.Enqueue(new student(4, “小颗豆五“, true));
queueStudents.Enqueue(new student(6, “小颗豆六“, false));
private void showExemple3()
richTextBox1.AppendText(“——–Queue与Queue&T&示例(先进先出)——–rn“);
richTextBox1.AppendText(“——–非泛型数组的操作(需要强制转换)———rn“);
while (queueStuds .Count &0)
richTextBox1.AppendText(((student)queueStuds.Dequeue()).ToString() + “rn“);
richTextBox1.AppendText(“现在数组个数=“+queueStuds.Count.ToString() + “rn“);
richTextBox1.AppendText(“——–泛型数组的操作(不需要强制转换)(先进先出)———rn“);
while (queueStudents.Count & 0)
richTextBox1.AppendText(queueStudents.Dequeue().ToString() + “rn“);
richTextBox1.AppendText(“现在数组个数=“ + queueStudents.Count.ToString() + “rn“);
Queue与Queue&T&都使用Enqueue()方法将一个对象加入到队列中,按照先进先出的法则,入栈后使用Dequeue()方法出队。出队后该成员被移除,区别仍是强制转换的问题。运行效果如图:
五、Stack与Stack&T&示例(先进后出,注意显示数据的顺序)
Stack stackStudnets1 = new Stack();
Stack&student& stackStudents2 = new Stack&student&();
private void button4_Click(object sender, RoutedEventArgs e)
richTextBox1.Document.Blocks.Clear();
addData4();
showExemple4();
private void addData4()
stackStudnets1.Push(new student(1, “小颗豆一“, true));
stackStudnets1.Push(new student(3, “小颗豆二“, false));
stackStudnets1.Push(new student(5, “小颗豆三“, true));
stackStudnets1.Push(new student(2, “小颗豆四“, false));
stackStudnets1.Push(new student(4, “小颗豆五“, true));
stackStudnets1.Push(new student(6, “小颗豆六“, false));
stackStudents2.Push(new student(1, “小颗豆一“, true));
stackStudents2.Push(new student(3, “小颗豆二“, false));
stackStudents2.Push(new student(5, “小颗豆三“, true));
stackStudents2.Push(new student(2, “小颗豆四“, false));
stackStudents2.Push(new student(4, “小颗豆五“, true));
stackStudents2.Push(new student(6, “小颗豆六“, false));
private void showExemple4()
richTextBox1.AppendText(“——–Stack与Stack&T&示例(先进后出,注意显示数据的顺序)——–rn“);
richTextBox1.AppendText(“——–非泛型数组的操作(需要强制转换)———rn“);
for (int i = 0; i & stackStudnets1 .C i++)
richTextBox1.AppendText(((student)stackStudnets1.Peek ()).ToString() + “rn“);
richTextBox1.AppendText(“(Stack.Peek()是返回不移除)现在数组个数=“ + stackStudnets1.Count.ToString() + “rn“);
richTextBox1.AppendText(“注意:以上数据次次返回的都是最后一次加到数组中的数———-“ +“rn“);
richTextBox1.AppendText(“下边:看看用Stack.Pop()返回并移除的结果:“ + “rn“);
while (stackStudnets1.Count & 0)
richTextBox1.AppendText(((student)stackStudnets1.Pop()).ToString() + “rn“);
richTextBox1.AppendText(“(Stack..Pop()是返回并移除)现在数组个数=“ + stackStudnets1.Count.ToString() + “rn“);
richTextBox1.AppendText(“——–泛型数组的操作(不需要强制转换)———rn“);
while (stackStudents2.Count & 0)
richTextBox1 .AppendText ((stackStudents2 .Pop ().ToString ()+“rn“));
richTextBox1.AppendText(“(Stack.Pop()是返回并移除)现在数组个数=“ + stackStudents2.Count.ToString() + “rn“);
这个集合类,本人感觉用在撤销操作是最方便不过的了,专门记录用户的操作,当需要撤销时,后进的是先出,对象所在位置都不需要判断,如果是泛型直接用即可,如果是非泛型转换一下。
注意,第一部分全是最后一次加入的成员,因为用的是Peek ()方法:返回不移除成员,永远返回最后一个加入的成员;如果用.Pop()方法就不同了:返回并移除,显示的效果及顺序如下图:
&&&&推荐文章:
【上篇】【下篇】15:25 提问
JAVA ArrayList对象不指定泛型的情况下里面存储的数据的类型
不知道为什么找不到char型的变量,没用泛型指定,转换成Object也不行
按赞数排序
如果不指定类型,与使用Object作为类型相同。如果指定类型,则只能存放该类型以及它的子类型,否则编译器报错。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。保证类型安全。无需强转
不知道你是如何认定存入的数据是char型,也许它被存为字符串了呢
c 会自动转为string类型,你用"c"寻找就可以了。如果要char形c,取出来后强制转换就可以了。不过建议用泛型定义list,这样数据更安全。
Collection 接口中 参数、返回值 都是 Object ,int、char、等都是原始类型,会被转为包装类型;
public String nextLine();【求助】如何实现arraylist.sort()自定义排序。。_c#吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:106,062贴子:
【求助】如何实现arraylist.sort()自定义排序。。收藏
看了好多大概了解是 obj要实现Comparable接口。 然后还要自己实现一个datalist.sort(comparer);如何实现求帮助。。。
AutoTDS-V1型全自动热解吸仪是一款20位常温二次全自动热解吸仪,气路采....
如何实现Comparer。。我是要对一个结构体数组排序public struct PCB()
Name = "NULL";
Priority = 0;
Ntime = 0;
Rtime = 0;
Arrivetime = 0;
State = 'W';
};如何根据arrivetime进行排序??
路过学习试试 。
试了一下,不知道是不是你需要的。
class Program
static void Main(string[] args)
Student s1 = new Student("aa", 17);
Student s2 = new Student("bb", 13);
Student s3 = new Student("cc", 14);
List&Student& students = new List&Student& { s1, s2, s3 };
List&Student& px=students.OrderBy(s=&s.Age).ToList();
foreach (Student s in px)
Console.WriteLine(s.Name+"
public class Student
public string Name { }
public int Age { }
public Student(string name, int age)
this.Name =
this.Age =
}我感觉这个不错
貌似你们都没用在排序这方面最出众的非泛型接口排序Icompareable&T&,Icompare&T&啊
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 泛型有什么用 的文章

 

随机推荐