【问题标题】:Check if a list is sorted case insensitive检查列表是否排序不区分大小写
【发布时间】:2020-01-26 19:08:08
【问题描述】:

在我对 Java 类的介绍中,我创建了一个方法,该方法采用此列表并输出一个新的排序列表。现在我正在尝试创建一个方法来检查此列表是否已排序(两者都不区分大小写)。我尝试使用简单的方法并使用 this.equals(this.sorted()) 但它不起作用,因为当我比较已经排序的列表时输出的是 false 而不是 true。我需要一些指导。我不能只使用数组或循环递归。

    import tester.Tester;


   // to represent a list of Strings
    interface ILoString {
        //prodces a new list, sorted in alphabetical order case insensitive
        ILoString sort();
        //helps sort() sort a list
        ILoString sortHelp(String acc);
        //determines whether this list is sorted in alphabetical order,
        //in a case-insensitive way.
        boolean isSorted();
    }
    // to represent an empty list of Strings
    class MtLoString implements ILoString {
        MtLoString(){}

       //prodces a new list, sorted in alphabetical order case insensitive
        public ILoString sort() {
          return this;
    }
        //helps sort() sort a list
        public ILoString sortHelp(String acc) {
          return new ConsLoString(acc, this);
        }

        //determines whether this list is sorted in alphabetical order,
        //in a case-insensitive way.
        public boolean isSorted() {
          return true;
        }
    }

    // to represent a nonempty list of Strings
    class ConsLoString implements ILoString {
        String first;
        ILoString rest;

        ConsLoString(String first, ILoString rest){
            this.first = first;
            this.rest = rest;  
        }



        //determines whether this list is sorted in alphabetical order,
        //in a case-insensitive way.
        public boolean isSorted() {
          return this.equals(this.sort());
        }


        //prodces a new list, sorted in alphabetical order case insensitive
        public ILoString sort() {
          return this.rest.sort().sortHelp(this.first);
        }

        //helps to sort the names in this ConsLoString
        public ILoString sortHelp(String acc) {
            if ( acc.compareToIgnoreCase(this.first) < 0) {
              return new ConsLoString(acc, this);
            }
              else {
                return new ConsLoString(this.first, this.rest.sortHelp(acc));
              }

            }


    }

    // to represent examples for lists of strings
    class ExamplesStrings{

        ILoString mary = new ConsLoString("Mary ",
                        new ConsLoString("had ",
                            new ConsLoString("a ",
                                new ConsLoString("little ",
                                    new ConsLoString("lamb.", new MtLoString())))));
        ILoString marySorted = new ConsLoString("a ",
            new ConsLoString("had ",
                new ConsLoString("lamb.",
                    new ConsLoString("little ",
                        new ConsLoString("Mary ", new MtLoString())))));

     // test the method sort for the lists of Strings
        boolean testSort(Tester t){
            return 
                t.checkExpect(this.mary.sort(),this.marySorted)&&
                t.checkExpect(this.marySorted.sort(),this.marySorted);
        }

        //test the method isSorted
        boolean testisSorted(Tester t){
          return 
              t.checkExpect(this.mary.isSorted(),false)&&
              t.checkExpect(this.marySorted.isSorted(),true);
      }
    }

【问题讨论】:

  • 我认为您的问题太模糊,无法得到任何答案。我认为您的代码中存在许多无法轻易解决的单一问题。
  • 那么,您的问题是如何使用递归而不是迭代方法来实现isSorted
  • @Lothar 基本上是的
  • ILoString 中没有方法getFirst 我发现很难找到解决方案。您提供的界面是否完整?再想一想,它本质上是sortHelp 的实现,以boolean 作为返回类型,并为方法中的两个条件提供相应的返回值。

标签: java list recursion


【解决方案1】:

您可以尝试创建一个新列表,这是您检查的列表的排序版本。然后根据原始列表检查该排序列表。如果它们相等,则您的原始列表已排序。

List<String> myStings = new ArrayList<>();
  myStings.add("Mary");
  myStings.add("had");
  myStings.add("a");
  myStings.add("little");
  myStings.add("lamb");

myStings = myStings.stream().map(x -> x.toLowerCase()).collect(Collectors.toList());
List<String> sortedList = myStings.stream().sorted().collect(Collectors.toList());

System.out.println("Unsorted list: " + myStings);
System.out.println("Sorted list: " + sortedList);
System.out.println("Was it a sorted list: " + myStings.equals(sortedList));

列表equals() 方法检查两个列表的大小是否相同,以及两个列表中所有对应的元素对是否相等。

哦,我刚刚在上面添加了一个步骤,将列表中的所有元素转换为小写。在上面的例子中,唯一的区别是“玛丽”这个词在你的排序列表中的位置,但总体上不应该对你想要实现的目标产生影响。

更新:

因此,此方法不适用于您的实现的原因是因为您实际上并未使用列表(或任何来自java.util.Collections 的东西)。您已经创建了自己的链表实现。因此,当您使用.equals() 方法时,您实际上使用的是java.lang.Object 中的该方法的默认实现。默认实现不检查对象中的内容,而是检查对象是否共享相同的内存地址。你的sort() 方法返回一个排序 列表,它是位于内存中不同地址的不同对象,因此.equals() 将报告为false

您需要做的实际上是检查对象中的变量(而不是内存地址)。为此,您需要在 ConsLoString 类中 Override 默认实现 .equals(),因为您实际上想对变量 first 进行比较

所以它看起来像这样......

@Override
public boolean equals(Object o) {
  ConsLoString toCompare = (ConsLoString) o;
  if(this.first == toCompare.first) {
    if (this.rest != null && toCompare.rest != null) {
      return this.rest.equals(toCompare.rest);
    } else {
      return Boolean.TRUE;
    }
  } else {
    return Boolean.FALSE;
  }
}

【讨论】:

  • 感谢您的帮助,我有点困惑我以为这就是我返回时所做的事情 this.equals(this.sorted());我以为我正在将此列表与此列表的排序版本进行比较。
  • 检查我上面所做的更新。您实际上没有使用 List 的 Java 实现,如 java.util.Collections 中所示。相反,您刚刚使用 Objects 创建了一个 List,并且 Objects 上 .equals() 的默认实现会检查 内存分配
  • 这是否解决了您的问题?请选中左侧的框以标记为已解决。谢谢。
猜你喜欢
  • 2016-12-25
  • 2019-02-06
  • 2020-10-21
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多