【问题标题】:My Array.sorts is not printing as intended我的 Array.sorts 没有按预期打印
【发布时间】:2021-02-13 07:43:57
【问题描述】:

我的 Arrays.sort 被忽略。正在打印数组而不进行排序。我尝试添加不同的参数并将其放置在不同的地方,但没有任何运气。我的程序假设在从文件中读取整数之后对数组进行排序。

package filterSort;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
import java.util.*;




public class FilterSort {

    public static int[] doubleArrayAndCopy(int[] arr) {
        
        int len = arr.length;
        
        
        int max = arr.length * 2;
        int[] copyArr = Arrays.copyOf(arr,max);
        int length = copyArr.length-1;
        Arrays.sort(copyArr, 0, length);
        
        return copyArr;

    }

    public static void main(String[] args) {
        int[] data = new int[8];
       
        
       
        try {
            File file = new File("data.txt");
            Scanner myReader = new Scanner(file);
            
            
            for(int i = 0; myReader.hasNext(); i++) {
                
                if(i == data.length - 1) {
                    
                    data = doubleArrayAndCopy(data);
                    
                    
                }else {
                
                    if(myReader.hasNextInt()) {
                        data[i] = myReader.nextInt();
                        System.out.println(data[i]);
                    }else {
                        myReader.next();
                    }
                }
            }
        } catch (FileNotFoundException e) {
            
            System.out.println("File not found");
        }
        
    }

}

这是我的输出:

4
44
99
1
2
9
3
4
90
162
92
0
1
22
4
2
3
99
-8
100
99
-3
98

我需要以这种格式对其进行排序。

如果我把 System.out.println 和 Arrays.sort 放在最后:

} catch (FileNotFoundException e) {
        
        System.out.println("File not found");
    }
    Arrays.sort(data, 0, data.length - 1);
   
    for(int j = 0; j < data.length; j++) {
        System.out.println(data[j]);
    }
    

它对它进行排序,但它会从空索引中输出所有额外的 0。

【问题讨论】:

  • 您在读取数据时打印出数据,而不是排序后的数组。使用Arrays.toString(data) 从数组中获取字符串表示形式(或使用for 循环将其打印出来),然后完成读取和排序后执行此操作。你的System.out.println 放错地方了。你也可以在阅读后离开排序,不需要每次加倍大小时排序,是吗?

标签: java arrays sorting


【解决方案1】:

我看到你想在每8个项目之后打印你的排序数组,如果我是对的,尝试在函数中打印copyArr,然后返回一个空的。并在for循环之后添加这个代码

if(data[0]!=null){
  data = doubleArrayAndCopy(data);}

希望对你有帮助

【讨论】:

    【解决方案2】:

    现有代码有几个缺陷:

    1. doubleArrayAndCopy 中,输入数组应进行排序,然后才将其大小加倍。
      复制后0's 将被添加到数组的末尾。 因此,doubleArrayAndCopy 方法可以重写为:
    public static int[] doubleArrayAndCopy(int[] arr) {
        Arrays.sort(arr);
        
        return Arrays.copyOf(arr, 2 * arr.length);
    }
    

    注意:但是,由于读取所有有效数字后需要重新排序数据,因此可能会完全跳过此方法中的排序。

    1. 当整个数组被填满时,初始数组的大小应该加倍,所以条件要更正为if (i == data.length)
    2. 如果输入数据中没有遇到数字,则数组的索引应递减以跳过无效值。
    3. 由于输入数据在其大小重复数次后可能不会填满整个数组,因此可能需要跟踪实际的数字计数并在读取时对数组的填充部分进行排序。

    话虽如此,代码可能会更新如下:

    public static void main(String[] args) {
        int[] data = new int[8];
        int numCount = 0;
        
        String input = "12 1 21 3 45 asv 56 7 32 44 reerg -23 55 0 32 12 thrt 34er "
                     + "23 tye 30 -18 234 40 332 91 32 84 22 102 -77 erg 33 -145";
        
        try (Scanner myReader = new Scanner(input)) {
            for(int i = 0; myReader.hasNext(); i++) {
                
                if(i == data.length) {
                    data = doubleArrayAndCopy(data);
                    System.out.printf("%nDoubled: %s%n%n", Arrays.toString(data));
                }
                if(myReader.hasNextInt()) {
                    data[i] = myReader.nextInt();
                    System.out.printf("[%d]=%d  ", i, data[i]);
                    numCount++; // counting valid numbers
                } else {
                    myReader.next();
                    i--; // skipping not-numbers
                }
            }
        }
        // sort only the valid numbers in the end
        Arrays.sort(data, 0, numCount);
        System.out.println("\nFinal: " + Arrays.toString(data));
    }
    

    输出:

    [0]=12  [1]=1  [2]=21  [3]=3  [4]=45  [5]=56  [6]=7  [7]=32  
    Doubled: [1, 3, 7, 12, 21, 32, 45, 56, 0, 0, 0, 0, 0, 0, 0, 0]
    
    [8]=44  [9]=-23  [10]=55  [11]=0  [12]=32  [13]=12  [14]=23  [15]=30  
    Doubled: [-23, 0, 1, 3, 7, 12, 12, 21, 23, 30, 32, 32, 44, 45, 55, 56, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    [16]=-18  [17]=234  [18]=40  [19]=332  [20]=91  [21]=32  [22]=84  [23]=22
    [24]=102  [25]=-77  [26]=33  [27]=-145  
    Final: [-145, -77, -23, -18, 0, 1, 3, 7, 12, 12, 21, 22, 23, 30, 32, 32, 32, 33,
    40, 44, 45, 55, 56, 84, 91, 102, 234, 332, 0, 0, 0, 0]
    

    更新 使用 Java 9 方法 Scanner::findAll 应用 Stream API 而不创建额外数组的示例:

    public static int[] getSortedIntInput(Scanner reader) {
        return reader
                    .findAll("[-+]?\\d+") // Stream<MatchResult>
                    .mapToInt(mr -> Integer.parseInt(mr.group(0))) // IntStream
                    .sorted()
                    .toArray();
    }
    
    public static void main(String[] args) {
        String input = "12 1 21 3 45 asv 56 7 32 44 reerg -23 55 0 32 12 thrt 34er "
                     + "23 tye 30 -18 234 40 332 91 32 84 22 102 -77 erg 33 -145";
        try (Scanner myReader = new Scanner(input)) {
            int[] data = getSortedIntInput(myReader);
            System.out.println(Arrays.toString(data));
        }
    }
    

    输出:

    [-145, -77, -23, -18, 0, 1, 3, 7, 12, 12, 21, 22, 23, 30, 32, 32, 32, 33, 34, 40,
    44, 45, 55, 56, 84, 91, 102, 234, 332]
    

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 2011-07-08
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多