如何将对象添加到 Java 中按字母顺序排列的链表?
How do I add an object to a linked list in alphabetical order in Java?
我看到类似的问题在参数中包含一个索引,但我的要求不允许我这样做。假设数组已经按字母顺序排序。
第一次提问,如有不妥请见谅
public void addElement(Object element){
LinkedListIterator iterator = new LinkedListIterator();
int counter = 1;
int compare = 0;
if(first == null)
iterator.add(element);
else
{
while(iterator.hasNext())
{
compare = getElement(counter).toString().compareToIgnoreCase(element.toString());
//getElement is a method I made to retrieve an element from the linked list
//I have tested it and I know it works. Its parameter is an index
//toString() returns a String of what the element is. example: { Fruit }
//It is in that format with the brackets {}
if(compare != -1)
iterator.add(element);
else
{
iterator.next();
counter++;
}
}
}
}
根据你的问题,我不知道你用什么作为比较值。它是对象中的字符串值、对象引用的名称等吗?假设您要插入一个基于某种名称变量的对象,您可以这样做。
注意:我相信您可以找到某种现有的 method/api 为您执行此操作,但我假设您希望了解它是如何完成的。
对于这个例子,我创建了一个名为 AnyObject 的 class 来迭代和比较。它看起来像这样:
AnyObjectclass
public class AnyObject {
private String name;
private int num;
private String color;
public AnyObject(String name, int num, String color) {
this.name = name;
this.num = num;
this.color = color;
}
@Override
public String toString() {
return name;
}
}
使用这个简单的 class,我们将修改您的代码,使其看起来像这样:
AlphaInsertSort Class
import java.util.*;
public class AlphaInsertSort {
public static void main(String[] args) {
ArrayList<AnyObject> myList = new ArrayList<AnyObject>();
myList.add(new AnyObject("alphaObj", 44, "blue"));
myList.add(new AnyObject("betaObj", 7, "orange"));
myList.add(new AnyObject("gammaObj", 12, "red"));
myList.add(new AnyObject("omegaObj", 99, "yellow"));
printList(myList); //helps visualize what's going on
addElement(new AnyObject("charlieObj", 105, "purple"), myList);
printList(myList);
addElement(new AnyObject("aObj", 105, "purple"), myList);
printList(myList);
myList.add(new AnyObject("thetaObj", 0, "green"));
printList(myList);
addElement(new AnyObject("zetaObj", 2, "pink"), myList);
printList(myList);
System.out.println("Finished");
}
public static void addElement(AnyObject element, ArrayList<AnyObject> myList){
ListIterator<AnyObject> iterator = null;
//int counter = 1; don't need this
int compare = 0;
AnyObject current = myList.get(0); //changed name from first to current and will use this for comparison while iterating
iterator = myList.listIterator(); //this should set iterator to start of list. There's no constructor for listIterator
System.out.println("\ncurrent is " + current.toString());
if(current == null)
iterator.add(element);
else
{
while(iterator.hasNext())
{
//compare = getElement(counter).toString().compareToIgnoreCase(element.toString());
compare = current.toString().compareToIgnoreCase(element.toString());
//for display purposes
System.out.println(current.toString() + " compared to " + element.toString() + " is " + current.toString().compareToIgnoreCase(element.toString()));
if(compare > 0) { //want to add element into list if compare is negative. Won't necessarily be -1
iterator.previous(); //will need to move back a spot before adding. Otherwise will always add element after first encountered element that doesn't come before element inserting
iterator.add(element);
break; //make sure to break. No need to continue iterating
}
else
{
current = iterator.next();
//counter++;
}
}
//if element is larger than all existing elements in list
if(!myList.contains(element)) {
iterator.add(element);
}
}
}
public static void printList(ArrayList<AnyObject> myList) {
System.out.println("List contents:");
for(AnyObject element : myList) {
System.out.println(element.toString());
}
System.out.println();
}
}
我删除了 counter int,因为您在说明中提到您没有使用索引的选项,所以包含它真的没有意义。还值得注意的是,compareTo 和 compareToIgnoreCase 不一定 return -1 和 1。它可以 return 任何正值和负值,因此更改条件会很聪明。此外,如果调用该方法的值小于与其进行比较的值,则 compareTo returns 为负数,因此您希望停止迭代并在比较为负时添加该值。此外,由于您没有比列表中当前位置前面 1 个元素的迭代器,因此当比较 return 一个负整数时,您需要将迭代器移回 1 个元素。如果你不这样做,你的新元素将总是被立即添加到按字母顺序排列的第一个元素之后。这是因为您无法在迭代器之后立即看到下一个元素。这有意义吗?
例如,如果您有一个包含 1、2、4、5 的列表,并且您想要向其中添加 3,您可以比较 1 与 3、2 与 3,然后 4 与 3。当您的迭代器达到 2,它不知道下一个值是什么。由于 3 大于 2,它移动到 4。4 小于 3,因此调用 add(3)。但是,这会将 3 放在与 (4) 进行比较的元素之后。您的列表将是 1、2、4、3、5。解决此问题的最简单方法是调用 iterator.previous();就在 iterator.add(3);
之前
如果您想进一步说明,请告诉我。
我看到类似的问题在参数中包含一个索引,但我的要求不允许我这样做。假设数组已经按字母顺序排序。 第一次提问,如有不妥请见谅
public void addElement(Object element){
LinkedListIterator iterator = new LinkedListIterator();
int counter = 1;
int compare = 0;
if(first == null)
iterator.add(element);
else
{
while(iterator.hasNext())
{
compare = getElement(counter).toString().compareToIgnoreCase(element.toString());
//getElement is a method I made to retrieve an element from the linked list
//I have tested it and I know it works. Its parameter is an index
//toString() returns a String of what the element is. example: { Fruit }
//It is in that format with the brackets {}
if(compare != -1)
iterator.add(element);
else
{
iterator.next();
counter++;
}
}
}
}
根据你的问题,我不知道你用什么作为比较值。它是对象中的字符串值、对象引用的名称等吗?假设您要插入一个基于某种名称变量的对象,您可以这样做。
注意:我相信您可以找到某种现有的 method/api 为您执行此操作,但我假设您希望了解它是如何完成的。
对于这个例子,我创建了一个名为 AnyObject 的 class 来迭代和比较。它看起来像这样:
AnyObjectclass
public class AnyObject {
private String name;
private int num;
private String color;
public AnyObject(String name, int num, String color) {
this.name = name;
this.num = num;
this.color = color;
}
@Override
public String toString() {
return name;
}
}
使用这个简单的 class,我们将修改您的代码,使其看起来像这样:
AlphaInsertSort Class
import java.util.*;
public class AlphaInsertSort {
public static void main(String[] args) {
ArrayList<AnyObject> myList = new ArrayList<AnyObject>();
myList.add(new AnyObject("alphaObj", 44, "blue"));
myList.add(new AnyObject("betaObj", 7, "orange"));
myList.add(new AnyObject("gammaObj", 12, "red"));
myList.add(new AnyObject("omegaObj", 99, "yellow"));
printList(myList); //helps visualize what's going on
addElement(new AnyObject("charlieObj", 105, "purple"), myList);
printList(myList);
addElement(new AnyObject("aObj", 105, "purple"), myList);
printList(myList);
myList.add(new AnyObject("thetaObj", 0, "green"));
printList(myList);
addElement(new AnyObject("zetaObj", 2, "pink"), myList);
printList(myList);
System.out.println("Finished");
}
public static void addElement(AnyObject element, ArrayList<AnyObject> myList){
ListIterator<AnyObject> iterator = null;
//int counter = 1; don't need this
int compare = 0;
AnyObject current = myList.get(0); //changed name from first to current and will use this for comparison while iterating
iterator = myList.listIterator(); //this should set iterator to start of list. There's no constructor for listIterator
System.out.println("\ncurrent is " + current.toString());
if(current == null)
iterator.add(element);
else
{
while(iterator.hasNext())
{
//compare = getElement(counter).toString().compareToIgnoreCase(element.toString());
compare = current.toString().compareToIgnoreCase(element.toString());
//for display purposes
System.out.println(current.toString() + " compared to " + element.toString() + " is " + current.toString().compareToIgnoreCase(element.toString()));
if(compare > 0) { //want to add element into list if compare is negative. Won't necessarily be -1
iterator.previous(); //will need to move back a spot before adding. Otherwise will always add element after first encountered element that doesn't come before element inserting
iterator.add(element);
break; //make sure to break. No need to continue iterating
}
else
{
current = iterator.next();
//counter++;
}
}
//if element is larger than all existing elements in list
if(!myList.contains(element)) {
iterator.add(element);
}
}
}
public static void printList(ArrayList<AnyObject> myList) {
System.out.println("List contents:");
for(AnyObject element : myList) {
System.out.println(element.toString());
}
System.out.println();
}
}
我删除了 counter int,因为您在说明中提到您没有使用索引的选项,所以包含它真的没有意义。还值得注意的是,compareTo 和 compareToIgnoreCase 不一定 return -1 和 1。它可以 return 任何正值和负值,因此更改条件会很聪明。此外,如果调用该方法的值小于与其进行比较的值,则 compareTo returns 为负数,因此您希望停止迭代并在比较为负时添加该值。此外,由于您没有比列表中当前位置前面 1 个元素的迭代器,因此当比较 return 一个负整数时,您需要将迭代器移回 1 个元素。如果你不这样做,你的新元素将总是被立即添加到按字母顺序排列的第一个元素之后。这是因为您无法在迭代器之后立即看到下一个元素。这有意义吗?
例如,如果您有一个包含 1、2、4、5 的列表,并且您想要向其中添加 3,您可以比较 1 与 3、2 与 3,然后 4 与 3。当您的迭代器达到 2,它不知道下一个值是什么。由于 3 大于 2,它移动到 4。4 小于 3,因此调用 add(3)。但是,这会将 3 放在与 (4) 进行比较的元素之后。您的列表将是 1、2、4、3、5。解决此问题的最简单方法是调用 iterator.previous();就在 iterator.add(3);
之前如果您想进一步说明,请告诉我。