zoukankan      html  css  js  c++  java
  • Java 常用的几个算法(菜鸟初学)

    【数组,数组列表,链表求最大值的算法比较(只是例子,可以举一反三)】

    方法类

    /**
     * 算法练习
     * @author Jason
     *
     */
    public class Methods {
        /**
         * 在数组中查找最大值算法(一般)
         * compareTo 不支持int 比较 所以要转成Integer  
         * 22行 报错详情:Cannot invoke(包含) compareTo(int) on the primitive(原始的) type int
         */
        public void SearchMaxFromArray(int prams[]){        
            if (prams.length==0) 
                throw new NoSuchElementException();
            int    largest=prams[0];
            for (int i = 0; i < prams.length; i++) {            
                if (Integer.valueOf(largest).compareTo(Integer.valueOf(prams[i]))<0) {
                    largest=prams[i];
                }
            }
            System.out.println(largest);    
        }
        /**
         * 在数组列表中找出最大元素
         * 与数组算法有点小的差别
         */
        public void SearchMaxFromArrayList(List<Integer> prams){
            if (prams.size()==0) 
                throw new NoSuchElementException();
                Integer    largest=prams.get(0);
            for (int i = 0; i < prams.size(); i++) {            
                if (Integer.valueOf(largest).compareTo(Integer.valueOf(prams.get(i)))<0) {
                    largest=prams.get(i);
                }
            }
            System.out.println(largest);    
        }
        /**
         * Linked 链表 无法高效的随机访问,但可以使用迭代器
         */
        public void SearchMaxFromLinked(List<Integer> list){
            if (list.isEmpty())
                throw new NoSuchElementException();
            Iterator<Integer> iter=list.iterator();
            Integer largest=iter.next();
            while (iter.hasNext()) {
                Integer next= (Integer) iter.next();
                if (Integer.valueOf(largest).compareTo(next)<0) {
                    largest=next;
                }
            }
            System.out.println(largest);
        }
    }

    测试类

    public class test {
        public static void main(String[] args) {
            /**
             * 测试第一个算法
             */
            int a[] =new int[]{1,4,3,6,78};
            Methods m=new Methods();
            m.SearchMaxFromArray(a);
            
            /**
             * 测试数组列表算法
             * 添加数据的时候要按下标序
             * 如果25,26换下位置就报错(这是码的时候有意测试的,错了就记录一下以便以后复习)
             */
            List<Integer> list =new ArrayList<Integer>();
            list.add(0, 12);    
            list.add(1,100);
            list.add(2,12);
            list.add(3,43);
            m.SearchMaxFromArrayList(list);
            
            /**
             * 测试LinkedList(链表算法)
             */
            List<Integer> list2 =new LinkedList<Integer>();
            list2.add(0, 12);    
            list2.add(1,100);
            list2.add(2,12);
            list2.add(3,43);
            m.SearchMaxFromLinked(list2);
            
        }
    }

    但有时候这些循环代码很容易出错,也不想每次都实现下面一系列的方法:

    1. static <T extends Comparable> T max(T[] a)
    2. static <T extends Comparable> T max(ArrayList<T> a)
    3. static <T extends Comparable> T max(LinkedList<T> a)

    为了高效使用最小的集合接口,采用set get方法进行随机访问比直接迭代层次高,上述计算链表最大值的过程中已经看到,这项任务并不需要进行随机访问,直接使用迭代就可以实现。因此可以简化上述方法:(使用一个方法实现上述3个方法的功能)

    小弟初学,下面的代码老是报hot Code 编码警告我不清楚具体原因,还请大家指教,谢谢!

    /**
         * 可以使用于数组,数组列表,LinkedList(链表)
         */
    public
    static <T extends Comparable<T>> T max(Collection<T> c) { if (c.isEmpty()) throw new NoSuchElementException(); Iterator<T> iter=c.iterator(); //迭代 T largest=iter.next(); while (iter.hasNext()) { T next=iter.next(); if (largest.compareTo(next)<0) { largest=next; } } return largest; }
    //main方法中直接调用 测试一句话我就不写了。

     

     

     

  • 相关阅读:
    Executors 构建线程池
    结构型模式——Bridge(未完成)
    结构型模式——Adapter
    创建型模式——Builder
    创建型模式——Abstract Factory
    Java与线程
    Java内存模型
    类加载
    Class类文件的结构
    垃圾收集器
  • 原文地址:https://www.cnblogs.com/ClodThunder/p/3929287.html
Copyright © 2011-2022 走看看