【问题标题】:Checking if an array is sorted检查数组是否已排序
【发布时间】:2012-04-08 20:12:27
【问题描述】:

我正在尝试构建一个接受整数数组作为参数并返回字符串的程序。如果数组从最小到最大排序,则字符串将是“升序”,如果数组从最大到最小排序,则为“降序”,“未排序”是数组根本没有排序,“所有相同”,如果数组的所有元素都相等。

到目前为止,我有以下代码。我在正确的轨道上吗?我在下面指示的行上不断收到错误消息,说“操作符 > 未定义参数类型”。知道是什么原因造成的吗?

import java.util.*;
import java.io.*;
import java.util.Scanner;

public class arrayCheck {
    public static void main(String[] args) throws IOException {
        arrayInput();
        isSorted(null);
    }

    public static String arrayInput() {
        int size = 0;
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the size of the array: ");
        size = in.nextInt();
        System.out.println("The size you enetered is " + size);
        int[] array = new int[size];
        System.out.println("Enter the array: ");
        int j = 0;
        while (j < size) {
            System.out.print("Enter int"+ (j + 1) + ": ");
            array[j] = in.nextInt();
            ++j;
        }
        in.close();
        String arrayS = Arrays.toString(array);
        return arrayS;
    }

    public static String isSorted(String[] arrayS) {
        int n = arrayS.length;
        for (int i = 0; i < n - 1; ++i)
            if (arrayS[i] > arrayS[i + 1])   //ERROR ON THIS LINE
                return "not ascending";
        return "ascending";
    }
}

【问题讨论】:

  • "我还是个 java 新手,所以对我来说太赤裸裸了!" - 我不会对任何人裸露,无论他们是否了解 Java。不过,我可能愿意接受你的问题。
  • 对错别字的伙伴哈哈大笑!

标签: java arrays sorting


【解决方案1】:

该错误表示未为 String 类型定义运算符 &gt;,这是数组的元素类型。运算符 &lt;&gt; 仅可用于基本类型,如 intlong,不能用于对象。

这里你需要改用String.compareTo,像这样:

    if (arrayS[i].compareTo(arrayS[i+1]) > 0)

【讨论】:

  • 我不知道!但我现在明白了。感谢彼得提供的信息丰富的回答。非常感谢!
【解决方案2】:

String 实现了Comparator,它可以让你比较两个对象的值(接口的形式实际上是Comparator&lt;E&gt;,所以你使用的是Comparator&lt;String&gt;)。

所以,而不是:

for (int i=0;i<n-1;++i) {
    if (arrayS[i]>arrayS[i+1]) {
        // Stuff

...你应该使用:

for (int i=0;i<n-1;++i) {
    if (arrayS[i].compareTo(arrayS[i+1]) > 0) {
        // Stuff

【讨论】:

    【解决方案3】:

    用户输入一个整数数组,所以数组的类型应该保持为int[]。例如:

    public static int[] arrayInput() {
        // ...
        return array;
    }
    
    public static String isSorted(int[] arrayS) {
        // ...
    }
    

    【讨论】:

    • 因此第二种方法是我应该在哪里将 int 数组转换为字符串数组?
    • @theolc,不,输入是作为文本到达的,如果要将其存储在 int[] 数组中,则需要先将每个 String 转换为 int,使用例如Integer.parseInt。然后您可以处理int[] 而不是String[],并将数组中的ints 与&gt; 进行实际比较。
    【解决方案4】:

    我认为你让事情变得比他们需要的更复杂。

    1. 在 arrayInput 中创建一个 int[],然后将其转换为字符串。为什么?
    2. 在 isSorted 中获取一个 String[] 并检查它是否已排序。
      1. 如果你坚持 #1 应该产生一个字符串,为什么 #2 需要一个 String[] 作为输入。
      2. 如果输入是 int[],我认为您的 isSorted 代码可以正常工作
    3. arrayInput 与 isSorted 没有任何关联。

    【讨论】:

      【解决方案5】:

      另一种策略。计算升序和降序数组是什么,然后看看它是否匹配。这可能效率较低,但它非常简单且易于实现/调试。我只需要将原始数组装箱即可进行反向排序。

      private static void isSorted(int[] array) {
          List<Integer> boxed = new ArrayList<Integer>();
          for (int i : array) {
              boxed.add(i);
          }
          List<Integer> ascending = new ArrayList<Integer>(boxed);
          Collections.sort(ascending);
      
          List<Integer> descending = new ArrayList<Integer>(ascending);
          Collections.reverse(descending);
      
          if (boxed.equals(ascending)) {
              System.out.println("Ascending");
          } else if (boxed.equals(descending)) {
              System.out.println("Descending");
          } else {
              System.out.println("Unsorted");
          }
      }
      

      【讨论】:

      • 您不需要进行两次排序 - 您可以使用 Collections.reverse()。您可能还可以使用Arrays.asList() 首先创建列表。
      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2020-06-04
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多