【问题标题】:Creating an object class with elements of varying but set length创建具有可变但固定长度的元素的对象类
【发布时间】:2017-10-30 06:33:29
【问题描述】:

我想创建一个包含一组数据的对象(Wine),其中每个数据元素的大小不同(年份、地区、制造商、品种等)。我希望能够使用每个元素的设置长度以表格格式打印出来。我已经搜索并尝试了很多方法,但找不到答案。

我的类定义如下所示:

public class Wine {
char[] year;
char[] area; // Wine area
char[] brand; // Wine brand
char type; // R or W or F
char[] variety;
char bin;
int numbottles;

我可以从 txt 文件中读取数据,但元素被缩短为文本内容加上一个空格,因此表格丢失了。

我在我的主要部分尝试过这个,但没有成功:

wine.year = rightpad(tokens[0].toCharArray(), 5) ;
wine.area = rightpad(tokens[1].toCharArray(), 9);
            ....

static char[] rightpad(char[] text, int leng) {
    for(int i = text.length - 1; i < leng; i++){
        text = (new String(text) + ' ').toCharArray();
    }
    return text;
}

任何建议将不胜感激。

克里斯·A

【问题讨论】:

  • 为什么不只是一个String 而不是char 数组?
  • 您的预期和实际输出是多少?
  • 我使用了 String.format 方法但没有成功。我逐行导入列表,将其拆分并将每个元素添加到 Wine 对象(首先尝试将相关项目格式化为所需长度),然后创建一个对象 Array list wineinfo (ArrayList wineInfo = null;) .然后使用 wineinfo.add 将每种葡萄酒添加到数组中。当我打印出数组时,它只在每个元素之间显示一个空格。
  • @ChrisAppleby 请展示你如何使用它。我的回答告诉你如何使用它来添加一些填充......我猜不出你是如何使用它来获得正确的输出的。请用问题编辑问题...

标签: java arrays char


【解决方案1】:

您可以使用String.format

String.format("%-8s", "test") // "test    "

您设置String 的长度并使用负值将空格添加到右侧(没有减号,添加到左侧)

有关格式的完整信息可在Formatter - Format String Syntax 中获得

【讨论】:

  • 要查看完整程序,请转到cappleby.net.au/exportToHTML/Main.java.html
  • @ChrisAppleby 不要指望我们检查您的代码...如果您愿意,请在您的问题中包含一个 sn-p...
  • 最后,我创建了自己的解析器,逐步遍历每一行,为对象的每个元素创建正确长度的字符串。谢谢你的cmets。克里斯A
  • @ChrisAppleby 您从未编辑过您的问题,因此提出的两个答案都是正确的。你应该看到what to do when you have an answer
  • 我很抱歉。现在包括最终答案。
【解决方案2】:

使用 org.apache.commons.lang.StringUtils Apache Commons Lang

StringUtils.leftPad("text", 7) // return "   text"

【讨论】:

  • 我试过了,还创建了我自己的右键功能。
  • StringUtils 它是保存方法的 Look 描述请。它还为您提供了更多的使用可能性。像 StringUtils.leftPad("bat", 8, "yz") = "yzyzybat"
【解决方案3】:

这是我的解析例程,它读取字符串行并提取每个对象元素,然后将它们添加到最后的对象中:

 static List<Wine> parseLine(String line, List<Wine> wineInfo) {
    String year = null;
    String area = null;
    String brand = null;
    String type = null;
    String variety = null;
    String bin = null;
    String numbottles = null;
    String drinkyear = null;
    String cost = null;
    Wine wine = new Wine(year, area, brand, type, variety, bin,
            numbottles, drinkyear, cost);
    int length = line.length();
    int j = 0;
    char yr[] = new char[3];

    for (int i = 0; i < 3; i++) {
        yr[j] = line.charAt(i);
        year = new String(yr);
        j = j + 1;
    }
    char temp[] = new char[7];
    j = 0;
    for (int i = 3; i < 10; i++) {
        temp[j] = line.charAt(i);
        area = new String(temp);
        j = j + 1;
    }
    char temp1[] = new char[12];
    j = 0;
    for (int i = 10; i < 22; i++) {
        temp1[j] = line.charAt(i);
        brand = new String(temp1);
        j = j + 1;
    }
    char temp3[] = new char[2];
    j = 0;
    for (int i = 22; i < 24; i++) {
        temp3[j] = line.charAt(i);
        type = new String(temp3);
        j = j + 1;
    }
    char temp2[] = new char[21];
    j = 0;
    for (int i = 24; i < 45; i++) {
        temp2[j] = line.charAt(i);
        variety = new String(temp2);
        j = j + 1;
    }
    char tmp[] = new char[6];
    j = 0;
    for (int i = 45; i < 51; i++) {
        tmp[j] = line.charAt(i);
        bin = new String(tmp);
        j = j + 1;
    }
    char temp4[] = new char[3];
    j = 0;
    for (int i = 51; i < 54; i++) {
        temp4[j] = line.charAt(i);
        numbottles = new String(temp4);
        j = j + 1;
    }
    char temp5[] = new char[4];
    j = 0;
    for (int i = 54; i < 58; i++) {
        temp5[j] = line.charAt(i);
        drinkyear = new String(temp5);
        j = j + 1;
    }
    char temp6[] = new char[7];
    j = 0;
    for (int i = 58; i < length; i++) {
        temp6[j] = line.charAt(i);
        cost = new String(temp6);
        j = j + 1;
    }

    wine.setYear(year);
    wine.setArea(area);
    wine.setBrand(brand);
    wine.setType(type);
    wine.setVariety(variety);
    wine.setBin(bin);
    wine.setNumbottles(numbottles);
    wine.setDrinkYear(drinkyear);
    wine.setCost(cost);

    wineInfo.add(new Wine(year, area, brand, type, variety, bin,
            numbottles, drinkyear, cost));

    return wineInfo;
}

}

然后我使用集合比较器方法进行排序:

 List<Wine> wineByYear = new ArrayList<Wine>(wineInfo);
 Collections.sort(wineByYear, Wine.YearComparator);

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2022-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2015-07-14
    • 2022-09-23
    相关资源
    最近更新 更多