排序三个不同的阵列

时间:2015-07-04 23:48:41

标签: java sorting

问题在于:编写一个程序,提示用户输入商品销售信息,包括商品名称,数量和金额。首先,要求用户输入商品数量,然后逐个输入商品销售信息。然后程序将按数量(从最大到最小)打印出商品信息,并按数量(从最大到最小)分类。我无法按数量和数量对用户的信息进行排序。例如,输出应该是这样的:

按数量排序:

  

项目数量金额
  CD 32 459.20
  T恤22 650.80
  书14 856.89

按金额排序:

  

项目数量金额
  第14册856.89
  T恤22 650.80
  CD 32 459.20

import java.util.Scanner;
public class SalesAnalysis {
  public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    System.out.println("Enter the number of goods");
    int number=1;
    int goods=input.nextInt();
    for(int i=1;i<=goods;i++){
        System.out.println("Enter information for item"+ number);
        number++;
        System.out.println("Name:");
        String name=input.next();
        String array[]=new String[]{name};
        System.out.println("Quantity:");
        int quantity=input.nextInt();
        int ar[]=new int[]{quantity};
        System.out.println("Amount (in USD):");
        double amount=input.nextDouble();
        double a[]=new double[]{amount};
        getQuantity(array,ar,a);
        getAmount(array,ar,a);
    }
    public static void getQuantity(String array[],int ar[],double a[]){
        System.out.println("Sort by Quantity:");
        System.out.println("--------------------");
        System.out.print("Item"+"      " +"Qty"+ "Amount" );
    }

}

2 个答案:

答案 0 :(得分:2)

好像你不熟悉java。

为Item创建一个类。将名称,数量和金额保留为其中的字段。 在创建此类时实现类似的界面。实现compareTo方法,根据数量进行比较。

在从用户那里获取输入时,继续为每个具有所需细节的项目创建一个对象,继续在arraylist中添加这些项目。

对arraylist进行排序(它会在您实施compareTo方法时对数量进行排序)。

迭代列表,并打印详细信息。

我知道你没有提到我在这里提到的很多东西,但是你最终会以这种方式学习很多关于OOP和Java的东西。

答案 1 :(得分:1)

编辑:新的和改进的答案。
因此,要开始这样做,您将要创建一个Item类,它可以存储项目的名称,项目数量和项目价格等信息。我是这样做的:

public class Item {
    private String name;
    private int quantity;
    private double price;

    public void setName (String name) {
        this.name = name;
    }
    public String getName () {
        return this.name;
    }
    public void setQuantity (int quantity) {
        this.quantity = quantity;
    }
    public int getQuantity () {
        return this.quantity;
    }
    public void setPrice (double price) {
        this.price = price;
    }
    public double getPrice () {
        return this.price;
    }
}

正如您所看到的,我已将所有存储的变量设为私有,因此我使用的是getter和setter 从这里开始,您将希望为用户提供输入项目的方法。我没有为此设置UI,但我已将其设置为程序在名为input.txt的文件夹中读取文件的位置。我是这样做的:

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class ItemManager {

    public Item[] items;
    public Item[] sortedByQuantity;
    public Item[] sortedByPrice;

    public static void main(String[] args) {
        String filepath = "input.txt";
        if(args.length >= 1) {
            if(args[0] != null) {
                filepath = args[0];
            }
        }
        ItemManager runProgram = new ItemManager();
        runProgram.AssignValues(filepath);
        runProgram.Display();
    }

然后,系统会使用您已完成的扫描仪分析input.txt的内容。输入文件的格式应如下所示:
ItemName(无空格)数量价格
新项目的新行

public void AssignValues(String filepath) {
        try{
            Scanner scanner = new Scanner(new File(filepath));
            StringBuilder sb = new StringBuilder();

            while(scanner.hasNextLine()){
                sb.append(scanner.nextLine());
                if(scanner.hasNextLine()){
                    sb.append(" ");
                }
            }
            String content = sb.toString();
            tokenizeTerms(content);
        }
        catch(IOException e){
            System.out.println("InputDocument File IOException");
        }
    }

此方法使用字符串构建器从输入文本中编译单个字符串。从这里它调用内容上的tokenizeTerms。此方法使用空格作为分隔符将字符串拆分为String [],因此无法在项目名称中使用空格。

public void tokenizeTerms(String content) {
        String[] tokenizedTerms = content.split(" ");
        Item[] itemArray = new Item[tokenizedTerms.length/3];
        int currToken = 0;
        for(int i = 0; i < itemArray.length; i++) {
            itemArray[i] = new Item();
            try {
                itemArray[i].setName(tokenizedTerms[currToken]);
                currToken++;
                int foo = Integer.parseInt(tokenizedTerms[currToken]);
                itemArray[i].setQuantity(foo);
                currToken++;
                double moo = Double.parseDouble(tokenizedTerms[currToken]);
                itemArray[i].setPrice(moo);
                currToken++;
            } catch (Exception e) {
                System.out.println("Error parsing data.");
            } 
        }
        this.sortedByPrice = itemArray;
        this.sortedByQuantity = itemArray;
        this.items = itemArray;
    }

在此方法中,它还会创建一个临时的Items数组。然后使用for循环对其进行迭代,并从输入文本中为项目分配相应的标记化值。现在我们要做的就是对数组进行排序并在控制台中打印它们。正如您在main方法中看到的那样,我们调用Display()

public void Display() {
        Arrays.sort(sortedByQuantity, (Item i1, Item i2) -> Double.compare(i1.getQuantity(), i2.getQuantity()));
        Arrays.sort(sortedByPrice, (Item i1, Item i2) -> Double.compare(i1.getPrice(), i2.getPrice()));
        System.out.println("Sorted by quantity:");
        for(Item currItem : sortedByQuantity) {
                System.out.println("Name: " + currItem.getName() + " Quantity: " + currItem.getQuantity() + " Price: " + currItem.getPrice());
        }
        System.out.println("Sorted by price:");
        for(Item currItem : sortedByPrice) {
                System.out.println("Name: " + currItem.getName() + " Quantity: " + currItem.getQuantity() + " Price: " + currItem.getPrice());
        }
    }

代码首先使用lambda表达式根据自定义比较方法对数组进行排序。从这里我们只是遍历每个数组并打印每个值。

这是您正在寻找的基本设置,您现在可以根据自己的喜好修改这些方法,并以任何合适的方式应用它们。您还可以修改它以允许用户直接在软件中输入值,或修改它以允许项目名称包含空格。祝你好运。