模拟java.util.Collection一些简单的用法

简介:

/*
需求:模拟java.util.Collection一些简单的用法!
 
注意:java虚拟机中并没有泛型类型的对象。泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的。
1)用泛型的原生类型替代泛型。
原生类型是泛型中去掉尖括号及其中的类型参数的类或接口。泛型中所有对类型变量的引用都替换为类型变量的最近上限类型,
如对于Cage<T extends Animal>, T的引用将用Animal替换,而对于Cage<T>, T 的引用将用Object替换。
 
2)
*/
interface Collection<T>{
    public abstract void add(T o);
    public abstract Object getElement(int index);
    public abstract void setElement(int index, T o);
    public abstract Object[] toArray();
    public abstract boolean isNext();
    public abstract Object nextElemenst();
}
 
class Array<T> implements Collection<T>{
     int buildNum = 10;
     int maxSize = 10;
     int size = 0;
     int flag = 0;
     int xIndex;
     Object[] elementsData = new Object[maxSize];
     /*
        判断时候数组大小不够
     */
     public void isFullSize(){
        if(maxSize == size){
           Object[] tmp = new Object[maxSize += buildNum];
           for(int i=0; i<size; ++i)
               tmp[i] = elementsData[i];
           elementsData = tmp;
        }
     }
     //添加元素
     public void add(T o){
         isFullSize();
         elementsData[size++] = o;
     }
      
     //得到某一个下标的元素
     public Object getElement(int index){
          if(index < size){
                System.out.println(elementsData[index].getClass().getName());
                return elementsData[index];
          }
          else return null;
     }
     //获取某一个元素的下标
     public int getIndex(T o){
          for(int i=0; i<size; ++i)
             if(o.equals(elementsData[i]))
                return i;
          return -1;
     }
     //设置某个元素为一新值
     public void setElement(int index, T o){
         if(index < size)
             elementsData[index] = o;
     }
     //放回对象数组
     public Object[] toArray(){
          return elementsData;
     }
     //是否有下一个元素
     public boolean isNext(){
         if(flag == 0){
             flag =1;
             xIndex=0;
         }
         if(xIndex == size){
                 flag = 0;
                 return false;
         }
          
         return true;
     }
     //返回下一个元素
     public Object nextElemenst(){
         return elementsData[xIndex++];
     }
      
     public static void qsort(Object arr[], int from, int to){
        //@SuppressWarnings("unchecked")
        if(from >= to) return;
        int mid = (from+to)/2;
        Object pivotkey = arr[from];
        if(arr[from] instanceof Comparable){
           System.out.println("dfsdfsdf");
           Comparable pp = (Comparable)arr[from];
        }
        if( ((Comparable)arr[mid]).compareTo(arr[from]) * ((Comparable)arr[mid]).compareTo(arr[to])<0){
            arr[from] = arr[mid];
            arr[mid] = pivotkey;
        }
        else if( ((Comparable<Object>)arr[to]).compareTo(arr[from]) * ((Comparable<Object>)arr[to]).compareTo(arr[mid])<0){
            arr[from] = arr[to];
            arr[to] = pivotkey;
        }
        pivotkey = arr[from];
        int low = from, high = to;
        while(low < high){
            while(low < high && ((Comparable<Object>)arr[low]).compareTo(pivotkey)>0)  ++low;
            while(low < high && ((Comparable<Object>)arr[high]).compareTo(pivotkey)<0)  --high;
             
            if(low < high){
               Object tmp = arr[low];
               arr[low] = arr[high];
               arr[high] = tmp;
            }
        }
         arr[low] = pivotkey;
         qsort(arr, from, low-1);
         qsort(arr, low+1, to);
     }
}
 
class Person implements Comparable<Person>{
   String name;
   int age;
   Person(){
       name = "";
       age = 0;
   }
   Person(String name, int age){
       this.name = name;
       this.age = age;
   }
   public String toString(){
       return name + "...." + age;
   }
    
   public boolean equals(Object o){
       Person x = (Person)o;
       return name.equals(x.name) && age==x.age;
   }
    
  
   public int compareTo(Person o){
       if(name.compareTo(o.name)==0)
          return age - o.age;
       return name.compareTo(o.name);
   }
}
 
class ArrayList<T>{
     Object elementsData[] = null;
     int size = 0;
     ArrayList(Collection<T> x){
         elementsData = x.toArray();
         for(int i=0; i<elementsData.length; ++i){
            if(elementsData[i]==null)
                break;
            ++size;//不计入空引用
         }
     }
     public void MaxToMinSort(){//从大到小排序
          Array.qsort(elementsData, 0, size-1);
     }
      
     public void output(){
         for(int i=0; i<size; ++i)
            System.out.println(elementsData[i]);
     }
}
public class Test{
   public static void main(String[] args){
        Array<Person>arr = new Array<Person>();
        for(int i=0; i<15; ++i)
           arr.add(new Person("h" + i + 1, i+1));
            
        System.out.println("Array 中的数据。。。。。");
        while(arr.isNext()){
            System.out.println( ((Person)arr.nextElemenst()) );
        }
        System.out.println(arr.getIndex(new Person("h101", 11)));
        System.out.println(arr.getElement(5));
        System.out.println("*******************************************************\nArrayList中排好序的数据!");
         
        ArrayList<Person> arrT = new ArrayList<Person>(arr);
        arrT.MaxToMinSort();
        arrT.output();
    }
}

目录
相关文章
|
5月前
|
Java
Java中的equals()与==的区别与用法
【7月更文挑战第28天】
78 12
|
2月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
3月前
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
57 10
|
3月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
42 10
|
3月前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
49 1
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
50 2
|
5月前
|
Java
java中return,break以及continue的用法
java中return,break以及continue的用法
50 10
|
6月前
|
Java
深入理解 Java 8 函数式接口:定义、用法与示例详解
深入理解 Java 8 函数式接口:定义、用法与示例详解
324 2
|
6月前
|
Java
Java 中 MessageFormat.format 用法
Java 中 MessageFormat.format 用法
81 1
|
6月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
86 4