Set無序怎么辦?


在JAVA中,提供多種不同的結構來組織對象,Set(集合)是其中的一種,本身是一個接口,其迭代時的順序取決於其具體實現。

典型的實現包括:

HashSet:哈希表是通過使用稱為散列法的機制來存儲信息的,元素並沒有以某種特定順序來存放;
LinkedHashSet:以元素插入的順序來維護集合的鏈接表,允許以插入的順序在集合中迭代;
TreeSet:提供一個使用樹結構存儲Set接口的實現,對象以升序順序存儲,訪問和遍歷的時間很快。

set有多種,hashset,treeset和linkedhashset比較常見,hashset最常用。linkedhashset是有序的,hashset是無序的。linkedhashset是以鏈表形式存放數據的,hashset是用hash散列存放數據的。list也分好幾種,主要有arraylist和linkedlist,都是有序的,其中arraylist類比數組,linkedlist類比鏈表。arraylist是線程不同步的,也就是說多個線程同時操作一個list那么List中存放數據的一致性就不能保證。vector是線程同步的,也就是說線程安全的。搜索
本回答被提問者采納

set集合 是不保證集合中元素的順序的

list 集合 才會有順序 List的特征是其元素以線性方式存儲

set它不允許出現重復元素 且允許包含值為null的元素,但最多只能有一個null元素

Set 和List 都繼承了Conllection

 

 

Java中按次序輸出Set集合中的元素

 

//對 set 的遍歷  
  
//1.迭代遍歷:  
Set<String> set = new HashSet<String>();  
Iterator<String> it = set.iterator();  
while (it.hasNext()) {  
  String str = it.next();  
  System.out.println(str);  
}  
  
//2.for循環遍歷:  
for (String str : set) {  
      System.out.println(str);  
}  
  
  
//優點還體現在泛型 假如 set中存放的是Object  
  
Set<Object> set = new HashSet<Object>();  
//for循環遍歷:  
for (Object obj: set) {  
      if(obj instanceof Integer){  
                int aa= (Integer)obj;  
             }else if(obj instanceof String){  
               String aa = (String)obj  
             }  
              ........  
}   

  

 

java中Set集合是一個不包含重復元素的Collection,首先我們先看看遍歷方法

 

package com.sort;  
  
import java.util.HashSet;  
import java.util.Iterator;  
import java.util.Set;  
  
/** 
 * 一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2, 
 * @author Owner 
 * 
 */  
public class SetTest2 {  
  
    public static void main(String[] args) {  
        Set<String> set = new HashSet<String>();  
          
        set.add("a");  
        set.add("b");  
        set.add("c");  
        set.add("d");  
        set.add("e");  
          
        set.add("e");//不能放入重復數據  
          
        /** 
         * 遍歷方法一,迭代遍歷 
         */  
        for(Iterator<String> iterator = set.iterator();iterator.hasNext();){  
            System.out.print(iterator.next()+" ");  
        }  
          
        System.out.println();  
        System.out.println("********************");  
          
        /** 
         * for增強循環遍歷 
         */  
        for(String value : set){  
            System.out.print(value+" ");  
        }  
    }  
}

  


注意:這里Set集合中放入的是String類型,假如我們放入一個自己定義的類實例的時候,比如Person類實例,這時候我們要自己重新hashcode和equal方法,用自己的關鍵字段來重寫,因為當使用HashSet時,hashCode()方法就會得到調用,判斷已經存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經加進去了,就不會再增加新的對象,否則加進去。

 

 

 

下面分析一下Set集合的另外一個重要實現類TreeSet,

TreeSet使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator進行排序,具體取決於使用的構造方法。 

通俗一點講,就是可以按照排序后的列表顯示,也可以按照指定的規則排序

 

 

Set<String> set = new TreeSet<String>();  
          
        set.add("f");  
        set.add("a");  
        set.add("b");  
        set.add("c");  
        set.add("d");  
        set.add("e");  
          
        System.out.println(set);  

  


輸出:[a, b, c, d, e, f]

 

按照排序后輸出

 

那么如果我們想讓他倒序輸出呢?當然方法很多。這里我采用指定一個規則讓他倒序輸出

 

 

package com.sort;  
  
import java.util.Comparator;  
import java.util.Iterator;  
import java.util.Set;  
import java.util.TreeSet;  
  
public class TreeSetTest3 {  
  
    public static void main(String[] args) {  
        Set<String> set = new TreeSet<String>(new MyComparator());  
          
        set.add("a");  
        set.add("b");  
        set.add("c");  
        set.add("d");  
        set.add("e");  
        set.add("A");  
          
        for(Iterator<String> iterator = set.iterator();iterator.hasNext();){  
            System.out.print(iterator.next()+" ");  
        }  
    }  
}  
  
class MyComparator implements Comparator<String>{  
  
    @Override  
    public int compare(String o1, String o2) {  
          
        return o2.compareTo(o1);//降序排列  
    }  
      
}  

 


輸出:e d c b a A 

 

 

如果Set集合中放入的是我們自己定義的一個類類型呢?

 

注意:一定要定義一個排序規則類實現Comparator接口,與上面的方法類似

 

package com.sort;  
  
import java.util.Comparator;  
import java.util.Iterator;  
import java.util.Set;  
import java.util.TreeSet;  
  
public class TreeSetTest2 {  
  
    public static void main(String[] args) {  
        Set<Person> set = new TreeSet<Person>(new PersonComparator());  
          
        Person p1 =  new Person(10);  
        Person p2 =  new Person(20);  
        Person p3 =  new Person(30);  
        Person p4 =  new Person(40);  
          
        set.add(p1);  
        set.add(p2);  
        set.add(p3);  
        set.add(p4);  
          
        for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){  
            System.out.print(iterator.next().score+" ");  
        }  
    }  
}  
  
class Person{  
    int score;  
      
    public Person(int score){  
        this.score = score;  
    }  
      
    public String toString(){  
        return String.valueOf(this.score);  
    }  
}  
  
class PersonComparator implements Comparator<Person>{  
  
    @Override  
    public int compare(Person o1, Person o2) {  
          
        return o1.score - o2.score;  
    }  
      
}

  

 

輸出:10 20 30 40 

如果按照一個人的分數的倒序排列,只需要更改compare方法中的o2.score-o1.score

 

 
 
 
 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM