2012-03-24 110 views
1

我想构建一个接受一个整数数组作为参数并返回一个字符串的程序。如果数组从最小值到最大值进行排序,字符串将是“升序”,如果数组从最大值到最小值排序,则“降序”,“未排序”是阵列根本不排序,“所有相同“如果数组的所有元素都相等。检查一个数组是否排序

到目前为止我的代码如下。我在正确的轨道上吗?我在下面指出的“The operator>未定义参数类型”一行中出现错误。任何想法可能会导致它?

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

“我仍然是Java的新手,所以我裸露!” - 我不会与任何人见面,不管他们是否了解Java。不过,我可能愿意承担你的问题。 – duffymo 2012-03-24 16:17:46

+0

哈哈我的坏与错字队友! – choloboy 2012-03-24 16:49:39

回答

8

错误意味着操作>String类型,这是您的阵列的元件类型没有定义。操作符<>仅适用于基本类型,如intlong,而不是对象。

在这里,你需要使用String.compareTo代替,就像这样:

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

我不知道!但我现在明白了。感谢信息丰富的答案彼得。非常感激! – choloboy 2012-03-24 16:51:53

2

String实现Comparator,它允许你比较两个对象(接口形式的值实际上是Comparator<E>,所以你使用Comparator<String>)。

因此,而不是:

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 
2

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

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

public static String isSorted(int[] arrayS) { 
    // ... 
} 
+0

因此,第二种方法是我应该将int数组转换为字符串数组? – choloboy 2012-03-24 17:06:57

+0

@theolc,不,输入是作为文本到达的,如果你想把它存储在一个'int []'数组中,你需要首先将每个'String'转换为'int'。 ['Integer.parseInt'](http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt%28java.lang.String%29)。然后你可以处理'int []'而不是'String []',并且实际上将数组中的'int'与'>'进行比较。 – 2012-03-24 17:17:06

+0

再次感谢您的帮助Peter – choloboy 2012-03-24 21:04:02

0

我认为你正在做的事情比他们需要更复杂。

  1. 在arrayInput中创建一个int [],然后将其转换为String。为什么?
  2. 在isSorted中,您接受一个String []并检查它是否已排序。
    1. 如果你坚持#1应该产生一个字符串,为什么#2接受一个String []作为输入。
    2. 我觉得你isSorted代码将工作得很好由于是,如果输入的是一个int []
  3. 没有什么用isSorted连接arrayInput。
0

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

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"); 
    } 
} 
+0

您不需要进行两次排序 - 您可以使用'Collections.reverse()'。你也可以使用'Arrays.asList()'来首先创建列表。 – DNA 2012-03-24 20:12:02

+0

@DNA好点。将更新答案。 – Adam 2012-03-24 20:48:18

+0

适用于原始类型... – Vlad 2017-05-17 17:38:15