java中list倒序的簡單介紹

  • 1、java linked list里的元素順序反過來
  • 2、對List集合倒序排序怎麼排
  • 3、java怎麼把list元素倒轉
  • 4、求java一個程序補全(list逆序輸出與查找)
  • 5、java 中,如何將1~100的偶數所組成的List集合倒序排列,謝謝!
  • 6、java 集合中怎麼將元素倒序排列

定義一個LinkedListInteger templist = new LinkedList();來存儲list裡面的值,通過迭代list,將值插入在templist的頭上,那麼templist就是list的反轉了,最後將templist賦值給list就行了!

如下代碼:

public void reverse() {

LinkedListInteger list = new LinkedList();

LinkedListInteger templist = new LinkedList();

int i = 0;

while (i  6) {

list.add(i);

i++;

}

IteratorInteger it = list.iterator();

int m;

while (it.hasNext()  i = 0) {

m = it.next();

templist.addFirst(m);

i–;

}

list = templist;

System.out.println(list);

}

運行結果為:

5 4 3 2 1 0

從API中可以看到List等Collection的實現並沒有同步化,如果在多線程應用程序中出現同時訪問,而且出現修改操作的時候都要求外部操作同步化;調用Iterator操作獲得的Iterator對象在多線程修改Set的時候也自動失效,並拋出java.util.ConcurrentModificationException。這種實現機制是fail-fast,對外部的修改並不能提供任何保證。

Iterator是工作在一個獨立的線程中,並且擁有一個 mutex鎖,就是說Iterator在工作的時候,是不允許被迭代的對象被改變的。

Iterator被創建的時候,建立了一個內存索引表(單鏈表),這個索引表指向原來的對象,當原來的對象數量改變的時候,這個索引表的內容沒有同步改變,所以當索引指針往下移動的時候,便找不到要迭代的對象,於是產生錯誤。

List、Set等是動態的,可變對象數量的數據結構,但是Iterator則是單向不可變,只能順序讀取,不能逆序操作的數據結構,當 Iterator指向的原始數據發生變化時,Iterator自己就迷失了方向。

所以如果像下面這麼寫就會拋出異常java.util.ConcurrentModificationException

public void reverse() {

LinkedListInteger list = new LinkedList();

int i = 0;

while (i  6) {

list.add(i);

i++;

}

IteratorInteger it = list.iterator();

int m;

while (it.hasNext()  i = 0) {

m = it.next();

list.add(m);

list.remove(0);

i–;

}

System.out.println(list);

}

[size=large][color=red]要對List排序,你要對List里裝的這種類型的類實現排序接口(Comparable).

舉個例子:

下面這個例子是對ListMyObject進行排序.使用Collections.sort(List list);方法,此方法會調用MyObject的compareTo方法.所以在MyObject類定義里要實現compareTo方法.

Java代碼

public class ListSort {

/**

* main()

* 2010-4-2,下午09:25:57

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

ListMyObject lists = new ArrayListMyObject();

MyObject obj1 = new MyObject(“d”);

MyObject obj2 = new MyObject(“a”);

lists.add(obj1);

lists.add(obj2);

Collections.sort(lists);

for (MyObject myObject : lists) {

System.out.println(myObject.getContent());

}

}

}

class MyObject implements ComparableMyObject{

private String content;

public MyObject(String _content) {

this.content = _content;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public int compareTo(MyObject obj) {

// TODO Auto-generated method stub

if (null == obj) return 1;

else {

return this.content.compareTo(obj.content);

}

}

}

下面是Collections.sort方法

Java代碼

public static T extends Comparable? super T void sort(ListT list) {

Object[] a = list.toArray();

Arrays.sort(a);

ListIteratorT i = list.listIterator();

for (int j=0; ja.length; j++) {

i.next();

i.set((T)a[j]);

}

}

實際上我們的MyObject類的方法compareTo是在Arrays.sort()中被調用的…

請看..

Java代碼

public static void sort(Object[] a) {

Object[] aux = (Object[])a.clone();

mergeSort(aux, a, 0, a.length, 0);

}

Java代碼

private static void mergeSort(Object[] src,

Object[] dest,

int low,

int high,

int off) {

int length = high – low;

// Insertion sort on smallest arrays

if (length INSERTIONSORT_THRESHOLD) {

for (int i=low; ihigh; i++)

for (int j=i; jlow

((Comparable) dest[j-1]).compareTo(dest[j])0; j–)

swap(dest, j, j-1);

return;

}

// Recursively sort halves of dest into src

int destLow = low;

int destHigh = high;

low += off;

high += off;

int mid = (low + high) 1;

mergeSort(dest, src, low, mid, -off);

mergeSort(dest, src, mid, high, -off);

// If list is already sorted, just copy from src to dest. This is an

// optimization that results in faster sorts for nearly ordered lists.

if (((Comparable)src[mid-1]).compareTo(src[mid]) = 0) {

System.arraycopy(src, low, dest, destLow, length);

return;

}

// Merge sorted halves (now in src) into dest

for(int i = destLow, p = low, q = mid; i destHigh; i++) {

if (q = high || p mid ((Comparable)src[p]).compareTo(src[q])=0)

dest[i] = src[p++];

else

dest[i] = src[q++];

}

}

[/color][/size]

當然,這是一種實現排序的辦法.還有一種是實現Comparator,實現這個接口,然後使用

Collections.sort(List list,Comparator c);這個方法來排序..

這個比較簡單:

ArrayListString list=new ArrayListString();

for(int i=0;i=5;i++){

list.add(“num”+i);

}

StringBuilder b = new StringBuilder(list.toString());

System.out.println(b.reverse());

好多方法,不會問我

不會又是你吧。剛好我今天沒什麼事

// Q2

    static void DisplayReverse(ListString element) {

        System.out.print(“null”);

        ListString [] ls=new ListString[numOfElements];

        int i=0;

        while (element != null) {

            ls[i]=element;

            element = element.next;

            i++;

        }

        for (int j = ls.length-1; j =0; j–) {

            System.out.print(“–“+ls[j].name + “[” + ls[j].id + “]” );

        }

    }

    // Q3

    static void Search(String query, ListString head) {

        int i=0;

        while (head != null) {

            if(head.name.equals(query)){

                i++;

            }

            head = head.next;

        }

        if(i0){

            System.out.println(“[Search] found:”+query+”[“+i+”]”);

        }else{

            System.out.println(“[Search] not found: “+query);

        }

    }

public class SortNums {

public static void main(String[] s){

ListInteger list = new ArrayListInteger();

for(int i=1;i=100;i++){

if(i%2==0){

list.add(i);

}

}

System.out.println(list);

Collections.sort(list,Collections.reverseOrder());

System.out.println(list);

}

}

好簡單的,輸出結果為:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

[100, 98, 96, 94, 92, 90, 88, 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2]

方法一:實現Comparable接口排序package collsort.comparable;

package com.cvicse.sort.comparable;

public class Cat implements ComparableCat {

private int age;

private String name;

public Cat(int age, String name) {

this.age = age;

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

……

public int compareTo(Cat o) {

return this.getAge() – o.getAge();

}

……

}

通過實現Comparable接口實現個性化排序測試。排序測試,Collection.sort(list)升序排列Collections.sort(list, Collections.reverseOrder());降序排列;Collections.reverse(list);反轉排序,先輸出列表最後一個元素

public class TestComparable {

public static void main(String args[]) {

test();

test2();

}

public static void test() {

……

ListCat listCat1 = new ArrayListCat();

Cat cat1 = new Cat(34, “hehe”);

Cat cat2 = new Cat(12, “haha”);

Cat cat3 = new Cat(23, “leizhimin”);

Cat cat4 = new Cat(13, “lavasoft”);

listCat1.add(cat1);

listCat1.add(cat2);

listCat1.add(cat3);

……

System.out.println(“調用Collections.sort(ListT list)listCat2升序排序:”);

Collections.sort(listCat1);

System.out.println(“降序排列元素:”);

Collections.sort(listCat1, Collections.reverseOrder());

System.out.println(“Collections.reverse 從列表中最後一個元素開始輸出:”);

Collections.reverse(listCat1);

……

}

/**

* 針對數組的排序

*/

public static void test2() {

String[] strArray = new String[] { “z”, “a”, “C” };

System.out.println(“數組轉換為列表”);

ListString list = Arrays.asList(strArray);

System.out.println(“順序排序列表”);

Collections.sort(list);

System.out

.println(“按String實現的Comparator對象String.CASE_INSENSITIVE_ORDER排序—-“);

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

System.out.println(“倒序排序列表”);

Collections.sort(list, Collections.reverseOrder());

……

}

}

方法二:實現Comparator接口排序

public class Person {

private int age;

private String name;

……

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

……

}

實現了Comparator接口,重寫了compare方法

import java.util.Comparator;

public class PersonComparator implements ComparatorPerson {

public int compare(Person o1, Person o2) {

return o1.getAge() – o2.getAge();

}

}

測試方法

public class TestComparator {

public static void main(String args[]) {

test1();

}

public static void test1() {

System.out.println(“升序排序測試:”);

ListPerson listPerson = new ArrayListPerson();

Person person1 = new Person(34, “lavasoft”);

Person person2 = new Person(12, “lavasoft”);

Person person3 = new Person(23, “leizhimin”);

Person person4 = new Person(13, “sdg”);

listPerson.add(person1);

listPerson.add(person2);

listPerson.add(person3);

ComparatorPerson ascComparator = new PersonComparator();

System.out.println(“排序後集合為:”);

// 利用Collections類靜態工具方法對集合List進行排序

Collections.sort(listPerson, ascComparator);

System.out.println(“\n降序排序測試:”);

// 從升序排序對象產生一個反轉(降序)的排序對象

ComparatorPerson descComparator = Collections

.reverseOrder(ascComparator);

System.out.println(“利用反轉後的排序接口對象對集合List排序並輸出:”);

Collections.sort(listPerson, descComparator);

outCollection(listPerson);

}

}

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126501.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:08
下一篇 2024-10-03 23:08

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Tensor to List的使用

    Tensor to List是TensorFlow框架提供的一個非常有用的函數,在很多的深度學習模型中都會用到。它的主要功能是將TensorFlow中的張量(Tensor)轉換為P…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論