【问题标题】:Sort array of strings based off of parent array?根据父数组对字符串数组进行排序?
【发布时间】:2011-12-07 01:24:09
【问题描述】:

我有一组按正确顺序排列的月份:

    String[] monthOrder = {"January","Febuary","March","April","May","June","July","August","September","October","November","December"};

我有一系列月份的顺序不正确。 . .

如何将不正确的月份数组排序为与正确顺序的月份一样。

编辑:

让我澄清一下,我正在从 SQL 服务器读取表格,它们最终会以任意顺序排列,我什至可能没有全部 12 个月。然后,我使用 JFreeGraph 从表格中读取的数字绘制图形... X 轴标签必须是我按正确顺序拥有的月份数。很抱歉一开始没有校准……太晚了:)

编辑 2:代码:

  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        m.setDatabase("Sioux Falls, SD");

int i = 0;
String newMonth = "";
String[] monthOrder = {"January","Febuary","March","April","May","June","July","August","September","October","November","December"};

   Set<String> sqlMonths = new HashSet<String>();
while(i < m.getAmountOfDateTables()){

    String date = m.getDateTables(i); //Gets the name of the table off the sql server FORMAT: Month Year
    int index = date.indexOf(" "); //gets the index of the space to separate the month and year
    String year = date.substring(index+1); //gets the year
    int currentYearInt = Calendar.getInstance().get(Calendar.YEAR); //gets current year
    String currentYear = String.valueOf(currentYearInt);//converts to string
    System.out.println(year);//test

    //I have a table called current need to ignore it.
    if(date.equalsIgnoreCase("current")){

    }else{

 newMonth = date.substring(0,index); //gets the month
    }



    if(year.equalsIgnoreCase(currentYear) || year.equalsIgnoreCase("current")){ //making sure it doesnt graph anything from past or future years...

    //dataset.addValue(m.getTotalForPersonInMonth(SalesPerson,m.getDateTables(i), Store),"Sales" , m.getDateTables(i)); THIS IS FOR GRAPHING WILL CHANGE WHEN SORTING IS DONE
        if(date.equalsIgnoreCase("Current")){

        }else{
            sqlMonths.add(newMonth); //add to sql months...
        }
        i++;

        //USED WHILE BECUASE FOR LOOP WOULDNT RUN WHILE WAS EASIER ANYWAY.

}else{

}

}

List<String> sortedMonths = new ArrayList<String>(); //your code
System.out.println(sqlMonths +" From sever"); //printing out sqlMonths
for (String month : monthOrder) {
  if (sqlMonths.contains(month))
    sortedMonths.add(month);
}
   System.out.println(sortedMonths +" Sorted");

        return dataset;



    }

抱歉给大家添乱了:S

编辑 3:哦,我觉得我很愚蠢......案例已关闭! :) 非常感谢 hasxz!

【问题讨论】:

  • 什么是“月数?”
  • 你能举个例子说明数据结构是什么样的,你希望输出是什么样的吗?
  • 抱歉是指月份......所以就像“2011 年 1 月”,那么下一个将是 2011 年 2 月等。现在它在 sql server 上有多少个月表是正确的,但是它们的顺序是错误的,因此我的图表是乱序的。
  • 数据:2011 年 1 月 - 2011 年 2 月 10 日 - 5 使用上面的数据以正确的顺序输出带有 x 轴的 JFreeGraph。问题是当我从服务器上读取表格时,它们的顺序错误,所以在图表上它们的顺序错误。我需要他们几个月的标准顺序。
  • 检查sqlMonths.size() 的大小。同样正如我所说,来自 sql 的 monts 应该与您在数组中的那些完全匹配。偶数大小写应该匹配。

标签: java arrays sorting jfreechart


【解决方案1】:

这是你可以做的......

创建为HashSet 从 SQL 服务器获得的那些。然后有这个逻辑。

String[] monthOrder = { "January", "Febuary", "March", "April", "May", "June", "July",
                "August", "September", "October", "November", "December" };
Set<String> sqlMonths = new HashSet<String>();
// Write your code to load the sqlMonths.
sqlMonths.add("March");
sqlMonths.add("December");
sqlMonths.add("Febuary");
List<String> sortedMonths = new ArrayList<String>();

for (String month : monthOrder) {
  if (sqlMonths.contains(month))
    sortedMonths.add(month);
}
System.out.println(sortedMonths);

输出:

[Febuary, March, December]

希望这能解决你的问题。

注意:月份的值应与monthOrder 完全匹配,即使大小写也不相同

【讨论】:

  • 尝试一下.. 似乎它会工作。如果我成功将接受答案! :)
  • 在 sqlMonths.get 上出现错误...它说“方法 get(String) 未定义为 Set 类型”
  • 尝试新代码并使用sqlMonts.add()添加元素
  • 好的,所以我做到了...当我执行 sqlMonths 的 system.out.println 时,它已经添加了它们,但是当我执行 sortedMonths 的 sop 时,我得到的只是 []... 应该它是 for(String month... 还是 month 需要有所不同...
【解决方案2】:

一种方法是创建一个 Map,其中每个字符串都对应于它的索引:{"January" : 0, "February : 1, ...}。然后你写一个比较器,它接受两个字符串,在映射中查找它们,然后比较结果的整数。你对未出现在地图中的字符串做什么是一个问题——如果你知道它不应该发生,你可能应该抛出一个异常,或者将所有这些杂项字符串放在排序的开头或结尾列表(并且可能按某些确定的顺序,如字母顺序)。

【讨论】:

  • 嗯...我从来没有使用过地图或比较器...似乎可以。你有例子吗?
  • 不幸的是我必须运行,所以我现在无法编写代码。但是 Maps 是 Java 的面包和黄油的一部分——如果您要编写大量 Java 代码,您应该真正掌握它们。 Comparator 只是一个定义值 A 是否小于、等于或大于值 B 的接口。然后您可以在各种排序方法中使用它,例如 Arrays.sortCollections.sort 中提供的方法。
【解决方案3】:

在 java 和其他语言中,您可以提供自己的比较器,例如,您可以在正确的数组中查找字符串并使用其索引位置作为数值来确定顺序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2013-11-05
    相关资源
    最近更新 更多