Сортировать массив строк на основе родительского массива? - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть массив месяцев в правильном порядке:

    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: О боже, я чувствую себя глупо ... дело было выключено! :) СПАСИБО ТАКОЕ havexz!

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Вот что вы можете сделать ...

Создайте как 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

1 голос
/ 07 декабря 2011

В Java и других языках вы можете предоставить свой собственный компаратор, где, например, вы можете искать строки в правильном массиве и использовать его позицию индекса в качестве числового значения для определения порядка

1 голос
/ 07 декабря 2011

Один из подходов заключается в создании карты, в которой каждая из ваших строк соответствует своему индексу: {"January" : 0, "February : 1, ...}. Затем вы пишете Comparator, который берет две строки, просматривает их обе на карте, а затем сравнивает полученные значения. Вопрос о том, что вы делаете со строками, которые не отображаются на карте, - вам, вероятно, следует либо сгенерировать исключение, если вы знаете, что это никогда не произойдет, либо поместить все эти разные строки в начало или конец отсортированного список (и, вероятно, в некотором детерминированном порядке, например, в алфавитном порядке).

...