0 0

双层for循环排序,如何优化0

class Cat
{
	private Integer id;
	private String title;
	
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	public boolean equals(Object obj) 
	{
		if(getClass() != obj.getClass())
		{
			return false;
		}
		Cat other = (Cat)obj;
		return this.getId().equals(other.getId());
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}


现在有一个List<Cat> ,要对其排序
排序规则如下:
Integer[] sort_id = {18,2,3,5,7,30,1};
id在上面的数组中的话,就按照数组中的顺序排序,
不在数组中的,就无所谓了

我的写法如下:
public List<Cat> sort(List<Cat> cats)
	{
		List<Cat> result = new ArrayList<Cat>();
		
		Integer[] sort_id = {18,2,3,5,7,30,1};
		
		//先排序指定的
		for(Integer sid : sort_id)
		{
			for(Cat cat : cats)
			{
				if(sid.intValue() == cat.getId().intValue())
				{
					result.add(cat);
				}
			}
		}
		
		//把剩余的加入到result中
		for(Cat cat : cats)
		{
			if(!result.contains(cat))
			{
				result.add(cat);
			}
		}
		
		return result;
	}


这里用了双层for循环,请问,如何优化



6个答案 按时间排序 按投票排序

0 0

/**
 *  现在有一个List<Cat> ,要对其排序
 排序规则如下:
 Integer[] sort_id = {18,2,3,5,7,30,1};
 id在上面的数组中的话,就按照数组中的顺序排序,
 不在数组中的,就无所谓了
 
 * 2014-9-3 下午1:51:58
 */
public class Main {


	public static void main(String[] args) {

		try {

			// 初始化数据
			List<Cat> list = new ArrayList<Cat>();
			for (int i = 1; i <= 30; i++) {
				Cat cat = new Cat();
				cat.setId(i);
				cat.setTitle("title " + i);
				list.add(cat);
			}

			// 指定排序条件
			Integer[] sortId = { 18, 2, 3, 5, 7, 30, 1 };
			
			Main mains = new Main();
			
			
			//方式一: list 转map 后 ,处理数据
			mains.prints(mains.sort01(list, sortId));
			
			//方式二: 前提,list中的索引 与 排序条件 相差1 并且 重写了 cat的equals方法, 思路:先获取sortId中对应的CatList,然后取差集,在取并集。
			mains.prints(mains.sort02(list, sortId));
			
			//方式三: 需要在 Cat类中加入 listIndex 字段,获取list时,初始化这个值. 同时这个值与 sortId联系在一起, 类似 方式二
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public List<Cat> sort02(List<Cat> list, Integer[] sortId) {
		
		//根据sortId排序
		List<Cat> result = new ArrayList<Cat>();
		for(Integer ints: sortId) {
			//获取 list中的索引:ints - 1
			result.add(list.get(ints - 1));
		}
		
		list.removeAll(result);
		
		//处理遗留的数据
		result.addAll(list);
		
		return result;
		
	}
	
	public List<Cat> sort01(List<Cat> list, Integer[] sortId) {
		
		//list to map
		Map<Integer, Cat> map = new HashMap<Integer, Cat>();
		for(Cat cat: list) {
			map.put(cat.getId(), cat);
		}
		
		//根据sortId排序
		List<Cat> result = new ArrayList<Cat>();
		for(Integer ints: sortId) {
			result.add(map.get(ints));
			
			map.remove(ints);
		}
		
		//处理遗留的数据
		for(Integer key: map.keySet()) {
			result.add(map.get(key));
		}
		
		return result;
		
	}
	
	
	private void prints(List<Cat> list) {
		for(Cat cat: list) {
			System.out.print("id:" + cat.getId() + ",title:" + cat.getTitle() + ";");
		}
		System.out.println();
	}

}

2014年9月03日 14:28
0 0

没有写注释,相信楼主能明白

public class C {

	
	
//	Integer[] sort_id = {18,2,3,5,7,30,1};
    public void sort(List<Cat> cats,Integer[]sort_id)  
    {  
        for(int i=0;i<cats.size();i++){
        	for(int j=0;j<sort_id.length;j++){
        		if(cats.get(i).getId().equals(sort_id[j])){
        			Cat temp = cats.get(j);
        			cats.set(j, cats.get(i));
        			cats.set(i, temp);
        		}
        	}
        }
    } 
    
    public static void main(String[] args) {
		C c  = new C();
		List<Cat> cats = new ArrayList<C.Cat>();
		for(int i=0;i<10;i++){
			Cat cat = c.new Cat();
			cat.setTitle("test");
			cat.setId(Integer.valueOf(i));
			cats.add(cat);
		}
		
		c.sort(cats, new Integer[]{3,5,2,9});
		System.out.println(cats);
	}
	
	
    class Cat  
    {  
        private Integer id;  
        private String title;  
          
        public int hashCode()  
        {  
            final int prime = 31;  
            int result = 1;  
            result = prime * result + ((id == null) ? 0 : id.hashCode());  
            return result;  
        }  
        @Override
		public String toString() {
			return "Cat [id=" + id + ", title=" + title + "]";
		}
		public boolean equals(Object obj)   
        {  
            if(getClass() != obj.getClass())  
            {  
                return false;  
            }  
            Cat other = (Cat)obj;  
            return this.getId().equals(other.getId());  
        }  
        public Integer getId() {  
            return id;  
        }  
        public void setId(Integer id) {  
            this.id = id;  
        }  
        public String getTitle() {  
            return title;  
        }  
        public void setTitle(String title) {  
            this.title = title;  
        }  
    }  
}

2014年9月03日 09:37
0 0

Integer[] sort_id = {18,2,3,5,7,30,1};  
          
        //先排序指定的  
        for(Integer sid : sort_id)  
        {  
            for(Cat cat : cats)  
            {  
                if(sid.intValue() == cat.getId().intValue())  
                {  
                    result.add(cat);  
                }  
            }  
        }  
可以修改为:
         Integer[] sort_id = {18,2,3,5,7,30,1}; 
        //转换成字符串
        String strId=Arrays.toString(sort_id);
        for(Cat cat : cats)  
            {  
                if(cat.getId().indexOf(strId)!=-1)  
                {  
                    result.add(cat);  
                }  
            }  
这样只有一个for循环,
       

2014年9月03日 09:16
0 0

不清楚下面的改动行不行

//先排序指定的 
        for(Integer sid : sort_id) 
        { 
            for(Cat cat : cats) 
            { 
                if(sid.intValue() == cat.getId().intValue()) 
                { 
                    result.add(cat); 
                } 
            } 
        } 
        cats.removeAll(result);
        result.addAll(result.size()-1, cats);

2014年9月02日 11:17
0 0

   可以考虑使用map,单层循环就可以了。

2014年9月02日 09:23
0 0

可以使用类似桶排序的方法。
将List<Cat> 放到有序的桶里。

2014年9月01日 18:23

相关推荐

    C++ For循环优化版

    C++循环冒泡法优化 在看到for循环冒泡排序(c++) 后 再次优化了一下,它的程序不能运行,我运行优化的成功了,对初学者理解有很大帮助(还有注释)

    选择排序和冒泡排序

    - 使用双层循环结构,外层控制比较的轮次,内层负责比较和交换操作。 **2.3 代码分析** 对于C语言版本的冒泡排序,代码如下: ```c for(h=n-1; h&gt;0; h=k) { /* 循环到没有比较范围 */ for(j=0, k=0; j; j++) { /...

    C语言版的排序方法---插入排序.docx

    插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,...在C语言中,插入排序的实现可以通过双层循环结构来完成,通过比较和移动元素实现数组的排序。

    c++冒泡排序

    在双层for循环结构中执行了冒泡排序的逻辑,其中外层循环变量j从0开始,直到9(因为最后一个元素不需要再次比较),内层循环变量i从0开始,直到9-j(每次外层循环结束后,最大的元素会被放置在正确的位置,所以每次...

    二维数组如何进行冒泡排序

    - 使用双层循环,从二维数组的每一个元素出发,将元素逐个添加到一维数组中。 - 示例代码片段: ```c int b[6]; // 定义一维数组 int k = 0; // 初始化计数器 for (int i = 0; i ; i++) { for (int j = 0; j ...

    java 冒泡排序法 PPT文档

    在Java中,冒泡排序可以使用for循环实现。你可以创建一个名为`bubbleSort`的方法,接收一个整数数组作为参数,然后在方法内部实现冒泡排序的逻辑。记得在实际编写代码时,考虑到边界条件和优化措施,以提高代码的...

    冒泡排序-Java 版本

    这种双层循环结构使得冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。虽然冒泡排序效率较低,但对于小规模数据或部分有序的数据,它仍然具有一定的实用价值。 此外,冒泡排序还有优化的版本,例如“早停”策略...

    常用排序算法Java

    Java实现选择排序时,通常使用一个for循环外加一个while或if循环,时间复杂度同样为O(n^2)。 3. 插入排序(Insertion Sort) 插入排序将未排序的元素逐个插入到已排序的部分,保持有序状态。Java实现插入排序可以...

    冒泡排序 VB

    接下来是冒泡排序的核心部分,通过双层循环实现。外层循环`For i = 1 To n - 1`控制了排序的轮数,因为每一轮都会把当前未排序部分的最大元素放到正确的位置。内层循环`For j = n To i + 1 Step -1`则负责在当前未...

    冒泡法排序算法

    排序的核心在于双层循环。外层循环`i`控制整个排序过程的轮次,内层循环`j`负责在每一轮中进行相邻元素的比较和必要时的交换。由于每完成一轮,最大的元素都会被放置在正确的位置上,因此内层循环的范围可以逐渐...

    4位数排序筛选

    由于采用了双层循环来进行两两元素之间的比较,当数据量较大时,效率会降低。 ### 总结 本文介绍了如何在C语言中实现一个特定的排序筛选功能,包括文件读写、自定义排序算法以及数组的基本操作等关键知识点。通过...

    c语言实验报告-循环结构程序设计.doc

    这个双层`for`循环实现了对数组的冒泡排序,每一轮循环都将当前未排序部分的最大元素“冒泡”到正确的位置。 总之,通过这次实验,学生不仅掌握了C语言中的基本循环结构,还学会了如何利用这些结构实现不同的算法,...

    VB控制结构多重循环.ppt

    描述中提到了“常用算法”,这可能是指通过多重循环实现的一些常见编程算法,例如遍历、查找、排序等。在实际编程中,熟练掌握多重循环可以帮助我们更有效地编写代码来解决复杂问题。 4.7.5部分详细介绍了VB中的...

    C#常见排序算法源码

    代码中,同样记录了排序开始时间,通过双层循环找到当前未排序部分的最小值,并将其放置在正确的位置上,直至整个数组排序完成。最后,输出排序所需时间。 ### 插入排序 插入排序的基本思想是:通过构建有序序列,...

    一个简单的C语言冒泡排序程序的示例,并附有详细的描述.pdf

    2. **双层循环**: - **外层循环**:控制排序的趟数,每一次循环都会把当前未排序部分的最大值移动到最后。 - **内层循环**:进行相邻元素的比较和交换。 3. **交换条件**:当发现前一个元素大于后一个元素时,就...

    关于冒泡排序的写法

    在Java语言中,冒泡排序的实现是通过双层循环来完成的。外层循环控制排序的总轮数,而内层循环则负责每一轮中相邻元素的比较和交换。下面详细介绍冒泡排序算法的写法和要点。 1. 主要思想:冒泡排序的基本思想是...

    大学C语言编程实例.pdf

    知识点:数组的声明和初始化、冒泡排序法、for循环语句的使用。 5. 数组的使用:在第五个例子中,我们可以看到使用了数组来存储十个数字,并将其逆序输出。这是一个基本的数组应用。 知识点:数组的声明和初始化、...

    VFP程序设计实例VFP程序设计实例.doc

    通过双层FOR循环分别遍历原矩阵的行和列,然后交换元素的位置。 7. **十进制转二进制** 提供了一个将用户输入的十进制整数转换为二进制的程序。使用DO WHILE循环,不断对十进制数进行除2取余操作,直到商为0,然后...

Global site tag (gtag.js) - Google Analytics