未排序或交换的对象数组列表
Arraylist of Objects not getting sorted or swaped
我想对对象进行排序,我已经以两种方式应用了该方法,但是 none 有效。打印 arraylist 的内容时,元素按插入顺序排列,而不是按字典顺序排列。
我确实在 stackoverlow 中做了研究:
- Sort ArrayList of ArrayList of objects
- 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
方法添加一个实现,传递两个要比较的对象引用。最后使用String
的compareTo
方法对列表进行排序
Collections.sort
接受 2 个参数:
- 待排序列表;
- 确定列表顺序的比较器。空值表示应使用元素的自然顺序。
字符串compareTo
returns:
- 如果参数字符串等于此字符串,则值
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());
}
输出:
如果它有效并且你想要解释任何事情,我可以尝试详细解释它!希望对你有帮助。
我想对对象进行排序,我已经以两种方式应用了该方法,但是 none 有效。打印 arraylist 的内容时,元素按插入顺序排列,而不是按字典顺序排列。
我确实在 stackoverlow 中做了研究:
- Sort ArrayList of ArrayList of objects
- 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
方法添加一个实现,传递两个要比较的对象引用。最后使用String
的compareTo
方法对列表进行排序
Collections.sort
接受 2 个参数:
- 待排序列表;
- 确定列表顺序的比较器。空值表示应使用元素的自然顺序。
字符串compareTo
returns:
- 如果参数字符串等于此字符串,则值
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());
}
输出:
如果它有效并且你想要解释任何事情,我可以尝试详细解释它!希望对你有帮助。