【问题标题】:Command line arguments to sort output用于对输出进行排序的命令行参数
【发布时间】:2012-10-25 15:35:20
【问题描述】:

我有一个库存管理系统,它读取项目和商店的 .txt 文件和一个名为 Stocks 的桥实体,并输出一个 .txt 文件,该文件显示基于这三个文件的信息。

它在底部。

public class Ims {

    private static Logger LOG = Logger.getLogger(Ims.class);

    public static void main(String[] args) throws Exception {
        PropertyConfigurator.configure("log.properties");

        LOG.debug("main()");

        File itemsFile = new File("items.txt");
        File storesFile = new File("stores.txt");
        File stockFile = new File("stocks.txt");

        if (!itemsFile.exists()) {
            LOG.error("Required 'items.txt' is missing");
        } else if (!storesFile.exists()) {
            LOG.error("Required 'stores.txt' is missing");
        }

        new Ims(itemsFile, storesFile, stockFile);
    }

    public Ims(File itemsFile, File storesFile, File stockFile) {
        LOG.debug("Ims()");
        HashMap<String, Item> items = null;
        HashMap<String, Store> stores = null;
        List<Stock> stocks = null;

        try {
            items = InventoryReader.read(itemsFile);
            stores = StoresReader.read(storesFile);
            stocks = StockReader.read(stockFile);
        } catch (ApplicationException e) {
            LOG.error(e.getMessage());
            return;
        }

        // Collections.sort(items, new CompareByPrice()); <-- this should sort it. How do I do this as a command line argument?

        File inventory = new File("inventory.txt");
        PrintStream out = null;
        try {
            out = new PrintStream(new FileOutputStream(inventory));
            InventoryReport.write(items, stores, stocks, out);
        } catch (FileNotFoundException e) {
            LOG.error(e.getMessage());
        }
    }
}

我希望能够使用命令行参数以多种方式对读取的参数进行排序。

例如:

java –jar Ims.jar by_value desc total

我该怎么做?

【问题讨论】:

标签: java command-line-arguments


【解决方案1】:

你有什么问题?阅读实际的命令行参数?您可以使用 args[] 数组来执行此操作,然后只需为您允许对排序执行任何操作的所有不同命令行参数放置一个开关。

args[] 数组内置于多种语言(包括 java)中,允许您在通过命令行调用某些内容时轻松访问传入的参数。例如,我相信您的示例,您可以通过 args[0] 读取 'by_value',通过 args[1] 读取 desc,通过 args[2] 读取总计等。

所以为了澄清我在下面的 cmets 中所说的话,你最终会想要这样的东西:

if (args.length > 0)
{
  for (int i=0; i<args.length;i++)
  {
     switch(args[i])
     {
        case <whatever your keyword is>: code for this keyword here
                                      break;
        case <next keyword>: code for next keyword
                             break;
     }
  }
}

等等

对于格式和内容方面的任何奇怪之处,我深表歉意,我有一段时间没有使用 Java,但这应该能让你继续前进。

请注意,如果这是您第一次使用开关,请记住您始终必须有一个默认值。这通常是某种“无效输入”消息,就像您在 javadocs 中的示例中看到的那样。

【讨论】:

  • 不是真正阅读命令行参数,更多的是如何让这些参数做事。像 by_value 应该按值、降序等对其进行排序...我如何将这些字符串映射到执行它们应该执行的操作的函数?
  • 做一个开关,首先做类似“if args[].length > 0”的事情来确保有参数,然后循环它们并设置你的开关来检查值,然后去找出 arg 是哪种情况,并为该值做你想做的事情。因此,在您的情况下,无论您传入的参数是什么(通过从数组槽中读取它),都可以进行切换以下是关于 switch 语句的 javadocs:docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
  • 这太棒了。谢谢好心的先生。
  • 您可能有兴趣使用JCommander。此 API 使处理命令行参数的工作变得简单而简单。你可以有一个TreeSet&lt;String&gt; 属性来为你排序你所追求的元素。它也很简洁,因为它会自动处理命令行帮助文本。
【解决方案2】:

您在 java 调用中放入的命令行参数出现在 Main 方法的 args 参数中。

所以,你应该有

 args[0] = "by_value"
 args[1] = "desc"
 args[2] = "total"

更新:如果您的命令行很复杂(标志、任何顺序的参数/缺失),有一个 Apache CLI(命令行界面)库可以帮助处理它。

【讨论】:

  • 该死你在我输入我的时候输入了这个:\ 无论如何都 +1 了。
  • @JoshBibb 你会更好地习惯它,更多的是“简单”的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多