未排序或交换的对象数组列表

Arraylist of Objects not getting sorted or swaped

我想对对象进行排序,我已经以两种方式应用了该方法,但是 none 有效。打印 arraylist 的内容时,元素按插入顺序排列,而不是按字典顺序排列。

我确实在 stackoverlow 中做了研究:

  1. Sort ArrayList of ArrayList of objects
  2. Sorting an ArrayList of objects (ArrayList not being changed after sorting)

我确实研究了 implements 方法,我们在其中设置了覆盖 compareTo 函数。但是,这些方法对我来说没有意义。我想让我的 ArrayList 成为一个私有变量,我看到的所有示例在 main class 中都有 ArrayList (我也是 OOP 语言的新手,想了解是否有人愿意给予适当的资源)。

如有任何帮助或提示,我们将不胜感激。

Main.java

import java.util.*;

public class Main {
  public static void main(String[] args) {
    
    Scanner scnr = new Scanner(System.in);
    int puedecCapacity = 0;
        
    String spa_nameString = null;

    Puedec puep = new Puedec();
    
    System.out.print("Enter 1st string to add: ");
        spa_nameString = scnr.next();
    puep.addPue(spa_nameString);
    
     System.out.print("Enter 2nd string to add: ");
        spa_nameString = scnr.next();
    puep.addPue(spa_nameString);
        
    System.out.print("Enter 3rd string to add: ");
        spa_nameString = scnr.next();
    puep.addPue(spa_nameString);    
        
    puep.sortPue();
    
    puep.printPue();
    
  }

}

Puedec.java

import java.lang.*;
import java.util.*;

public class Puedec {
        
    private int Puedec_size;
    private int Puedec_size_fill_count;
    
    private ArrayList<Pue> pue_ArrayList = new ArrayList<Pue>(getCapacity());

    
    public Puedec() {
        
        this(3);
        
    }
    
    public Puedec(int capacity) {
        
        Puedec_size = capacity;
        
    }
    
    public int getSize() {
        
        return Puedec_size_fill_count;
        
    }
    
    public int getCapacity() {
        
        return Puedec_size;
        
    }

    public boolean addPue(String spa) {
        
        if(getSize() == getCapacity()) {
            
            System.out.println("Error");
            
            return false;
            
        }else {
            for(Pue p : pue_ArrayList) {
                
                if(p.getSpa().contains(spa)) {
                    
                    System.out.println("Error");
                    
                    return false;
                }
                
            }
            
            
            pue_ArrayList.add(new Pue(spa)); 

            ++Puedec_size_fill_count;
            return true;
         }  
        
    }
    
    public void sortPue() {
        
        // This also not changing anything in the ArrayList
        /*
        pue_ArrayList.sort((pk1, pk2)
                     -> pk1.getSpa().compareTo(
                         pk2.getSpa())
                 );
        */
                
        
        int size = pue_ArrayList.size();
        
        for(int i = 0; i < pue_ArrayList.size() - 1; i++) {
            
            for(int j = 0; j < pue_ArrayList.size(); j++) {
                
                if(pue_ArrayList.get(i).getSpa().compareTo(pue_ArrayList.get(j).getSpa()) > 0) {
                    
                    Pue tempPue = pue_ArrayList.get(i);

                    pue_ArrayList.set(i, pue_ArrayList.get(j));
                    
                    pue_ArrayList.set(i, tempPue);
                    
                }
                
            }
            
        }
        
    }
    
    public void printPue(){
         for(Pue pp : pue_ArrayList) {
            System.out.println(pp.getSpa());
        }
    }

}

Pue.java

public class Pue {

    private String spa; 
    
    public Pue(String spa) {
        this.spa = spa;
    }

    public String getSpa() {
        return spa;
    }
}

乍一看,这可能是问题的根源。

    Pue tempPue = pue_ArrayList.get(i);

    pue_ArrayList.set(i, pue_ArrayList.get(j));
    
    pue_ArrayList.set(i, tempPue);
    

因此,您取出第 i 个元素,将第 i 个元素设置为其他元素,然后将第 i 个元素设置回原来的状态。最终结果:没有任何改变。

最后一次使用'i'应该是'j',但我没有详细分析。

您可以尝试将此代码添加到您的 sortPue() 方法中:

public void sortPue() {
    Collections.sort(pue_ArrayList,
        new Comparator<Pue>()
        {
            public int compare(Pue pp1, Pue pp2)
            {
                return pp1.getSpa().compareTo(pp2.getSpa());
            }        
        });
}

实现Comparator时,必须指定要比较的类型,本例中有<Pue>。然后,我们必须为 compare 方法添加一个实现,传递两个要比较的对象引用。最后使用StringcompareTo方法对列表进行排序

Collections.sort 接受 2 个参数:

  • 待排序列表;
  • 确定列表顺序的比较器。空值表示应使用元素的自然顺序。

字符串compareToreturns:

  • 如果参数字符串等于此字符串,则值0
  • 一个值less than 0如果这个字符串在字典序上小于字符串参数;
  • 一个值 greater than 0 如果此字符串在字典序上大于字符串参数。

我有两个解决方案。

既然你说当我们重写 compareTo 等对你来说没有多大意义,我将在最简单的解决方案之后提供一个真正基本的解决方案。

最简单

public void sortPue() {
    pue_ArrayList.sort(Comparator.comparing(Pue::getSpa));
}

基础款

    List<Pue> listToSort = puep.getPue_ArrayList();

    Pue[] array = listToSort.toArray(new Pue[0]);

    System.out.println("before sorting");
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i].getSpa());
    }

    System.out.println("after sorting");

    for(int i = 0; i < array.length-1; ++i) {
        for (int j = i + 1; j < array.length; ++j) {
            if (array[i].getSpa().compareTo(array[j].getSpa()) > 0) {
                Pue temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

    System.out.println("\nAfter performing lexicographical order: ");
    for(int i = 0; i < array.length; i++) {
        System.out.println(array[i].getSpa());
    }

输出:

如果它有效并且你想要解释任何事情,我可以尝试详细解释它!希望对你有帮助。