【问题标题】:How do I add an object to a linked list in alphabetical order in Java?如何在 Java 中按字母顺序将对象添加到链表?
【发布时间】:2015-04-13 03:42:40
【问题描述】:

我看到了在参数中包含索引的类似问题,但我的要求不允许我这样做。假设数组已经按字母顺序排序。 这是我第一次问一个问题,如果我做错了什么,很抱歉。

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++;
            }
        }
    } 
}

【问题讨论】:

  • 查找插入排序。
  • 请注意,compareToIgnoreCase 不仅返回 -1、0、1 之一!
  • 嗨,布雷特,你能详细说明你的问题吗?
  • LinkedLIstIterator 来自哪里?它不是java.util 的一部分。
  • LinkedListIterator 是否意味着ListIterator

标签: java linked-list iterator compare add


【解决方案1】:

根据您的问题,我不确切知道您使用什么作为比较值。它是对象内的字符串值、对象引用的名称等吗?假设您要插入基于某种名称变量的对象,您可以这样做。

注意:我相信您可以找到某种现有的方法/api 为您执行此操作,但我假设您想看看它是如何完成的。

对于这个例子,我创建了一个名为 AnyObject 的类来迭代和比较。它看起来像这样:

AnyObject 类

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;
}

}

使用这个简单的类,我们将修改您的代码,使其看起来像这样:

AlphaInsertSort 类

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 不一定返回 -1 和 1。它可以返回任何正值和负值,因此更改条件会很聪明。此外,如果调用该方法的值小于要与之比较的值,则 compareTo 返回一个负数,因此您希望在 compare 为负数时停止迭代并添加该值。此外,由于您没有比您当前在列表中的位置提前 1 个元素的迭代器,因此当比较返回负整数时,您需要将迭代器移回 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) 之前;

如果您需要进一步说明,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2017-02-27
    相关资源
    最近更新 更多