Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从当前月份开始订购月份名称_Java_Sorting - Fatal编程技术网

Java 如何从当前月份开始订购月份名称

Java 如何从当前月份开始订购月份名称,java,sorting,Java,Sorting,假设这是用于存储月份的数组 String months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 我已使用此方法获取当前月份 int monthName=calendar.get(Calendar.MONTH); 从当前月份开始,将数

假设这是用于存储月份的数组

String months[] = {"January", "February", "March", "April",
            "May", "June", "July", "August", "September",
            "October", "November", "December"};
我已使用此方法获取当前月份

int monthName=calendar.get(Calendar.MONTH);
从当前月份开始,将数组重新排序为新数组或arraylist的最佳方式是什么

当前月份是8月,因此需要的数组或Arraylist是

months[] = {"August", "September", "October", "November",
            "December", "January", "February", "March", "April",
            "May", "June", "July"};

使用比较器的整个解决方案。

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

/**
 * The Class Test.
 */
public class Test {

    /**
     * The main method.
     *
     * @param args the arguments
     */
    public static void main(String[] args) {
        // First convert to List.
        String[] monthsAsArray = { "August", "September", "October", "November", "December", "January", "February",
                "March", "April", "May", "June", "July" };
        List<String> months = Arrays.asList(monthsAsArray);

        // Comparator can do a lot of the work for us...
        final Comparator<String> dateCompare = new Comparator<String>() {
            public int compare(String o1, String o2) {
                Date month1 = null, month2 = null;
                try {
                    SimpleDateFormat s = new SimpleDateFormat("MMM");
                    month1 = s.parse(o1);
                    month2 = s.parse(o2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return month1.compareTo(month2);
            }
        };
        Collections.sort(months, dateCompare);
        System.out.print(months);
    }
}
import java.text.simpleDataFormat;
导入java.util.array;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.Date;
导入java.util.List;
/**
*班级考试。
*/
公开课考试{
/**
*主要方法。
*
*@param将参数设置为args
*/
公共静态void main(字符串[]args){
//首先转换为列表。
String[]monthsasaray={“八月”、“九月”、“十月”、“十一月”、“十二月”、“一月”、“二月”,
“三月”、“四月”、“五月”、“六月”、“七月”};
列表月份=Arrays.asList(monthsaarray);
//比较器可以为我们做很多工作。。。
最终比较器dateCompare=新比较器(){
公共整数比较(字符串o1、字符串o2){
日期month1=null,month2=null;
试一试{
SimpleDataFormat s=新的SimpleDataFormat(“MMM”);
month1=s.parse(o1);
month2=s.parse(o2);
}捕获(例外e){
e、 printStackTrace();
}
返回月1。比较月2;
}
};
集合。排序(月份、日期比较);
系统输出打印(月);
}
}

因为您已经在数组中定义了月份的名称:

String months[] = {"January", "February", "March", "April",
    "May", "June", "July", "August", "September",
    "October", "November", "December"};
您可以使用如下简单循环:

String[] newArray = new String[12];

Calendar calendar = Calendar.getInstance();
int monthName = calendar.get(Calendar.MONTH);
int i = 0;
do {
    newArray[i] = months[(monthName + i) % 12];
    i++;
} while (i < 12);

System.out.println(Arrays.toString(newArray));
这我怎么能做到呢

int pos = -1;
for(int i=0;i<months.length;i++)
  if(months[i].equals(monthName))
  {
    pos = i;
    break;
  }

String[] newOrderedMonths = new String[12];
int index = 0;
for(int i = pos ; i < months.length; i++ )
  newOrderedMonths[index++] = months[i];

for(int i = 0 ; i < pos; i++ )
  newOrderedMonths[index++] = months[i];
intpos=-1;

对于(int i=0;i请尝试以下操作:

String[] newMonths = Arrays.copyOfRange(months, monthName, monthName + 12);
System.arraycopy(months, 0, newMonths, 12 - monthName, monthName);

可以使用Collections.rotate。要向左旋转,可以使用元素的负值

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

int monthIndex = LocalDate.now().getMonth().ordinal();//indexed from 0

Collections.rotate(Arrays.asList(months), -monthIndex); //negative value rotates to left

System.out.println(Arrays.toString(months));

输出:
[八月、九月、十月、十一月、十二月、一月、二月、三月、四月、五月、六月、七月]
使用Java 8的
月.values()
集合.rotate()


这应该可以做到,使用Collections.rotate

给出了旋转时间的逻辑,并进行了相应的编码

import java.util.*;

public class Rotate {
    public static void main(String[] args) {

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

        List<String> mons = Arrays.asList(months);

        System.out.println("Before : " + Arrays.toString(months));

        // September is at 9the position so rotate it 4 times, i,e 13th position, 13%12 = 1
        Collections.rotate(mons, 4);

        months = (String[]) mons.toArray();

        System.out.println("After : " + Arrays.toString(months));
    }
}
import java.util.*;
公共课轮换{
公共静态void main(字符串[]args){
字符串月份[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”,
“十月”、“十一月”、“十二月”};
List mons=Arrays.asList(月);
System.out.println(“Before:+Arrays.toString(月));
//9月是9号,所以旋转4次,即13号位置,13%12=1
集合。轮换(mons,4);
月份=(字符串[])mons.toArray();
System.out.println(“之后:“+Arrays.toString(月));
}
}

对于那些很快或以后想要使用java 8执行相同操作的人来说,这只是另一个选项:)

List myMonth=Arrays.asList(Month.values());
Collections.rotate(myMonth,1-LocalDate.now().getMonthValue());
输出:

[八月、九月、十月、十一月、十二月、一月、二月、三月、四月、五月、六月、七月]

这个怎么样:

import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;

public class RotateDemo {
    public static void main(String[] args)
    {
        String months[] = {"January", "February", "March", "April",
                "May", "June", "July", "August", "September",
                "October", "November", "December"};

        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int month = cal.get(Calendar.MONTH);

        System.out.println(month + "Date: " + date);
        System.out.println("Original Array : " +
                Arrays.toString(months));

        Collections.rotate(Arrays.asList(months), month-2);

        System.out.println("Modified Array : " +
                Arrays.toString(months));
    }
}

如果你不想改变输入数组,你可以看看这个可能的解决方案

public class MonthDemo {

    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

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

        // get index of current month
        int monthIndex = calendar.get(Calendar.MONTH);

        // array to keep the orderen month names
        String[] monthOrdered = new String[months.length];

        // create a stream with indexes for one year start with current month
        IntStream.range(monthIndex, monthIndex + 12)
                .sequential()
                // fill the ordered array
                .forEach(i -> monthOrdered[i - monthIndex] = months[i % 12]);
        System.out.println("monthOrdered = " + Arrays.toString(monthOrdered));
    }
}
输出(已包装)


检查
Collections.rotate
[docs](例如,它按顺序返回月份(即1月-12月)。或者,如果删除Collections.sort,它将只打印原始数组。小心
ordinal()
,因为这依赖于内部实现,最好使用
getValue()
(虽然,几个月来,我敢打赌我们使用
ordinal
是非常安全的)@HuguesM。是的,你是对的。
ordinal
来自Enum,所以结果取决于月份在
Month
Enum中的位置。只有从1月份开始,月份仍然被排序时,这才有效。我在这里使用它将一月映射到0(如果是第一个月,则旋转0个元素),并避免在旋转时使中的
-1
+1
代码复杂化。
import java.util.*;

public class Rotate {
    public static void main(String[] args) {

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

        List<String> mons = Arrays.asList(months);

        System.out.println("Before : " + Arrays.toString(months));

        // September is at 9the position so rotate it 4 times, i,e 13th position, 13%12 = 1
        Collections.rotate(mons, 4);

        months = (String[]) mons.toArray();

        System.out.println("After : " + Arrays.toString(months));
    }
}
List<Month> myMonth = Arrays.asList(Month.values());

Collections.rotate(myMonth, 1 - LocalDate.now().getMonthValue());
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;

public class RotateDemo {
    public static void main(String[] args)
    {
        String months[] = {"January", "February", "March", "April",
                "May", "June", "July", "August", "September",
                "October", "November", "December"};

        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int month = cal.get(Calendar.MONTH);

        System.out.println(month + "Date: " + date);
        System.out.println("Original Array : " +
                Arrays.toString(months));

        Collections.rotate(Arrays.asList(months), month-2);

        System.out.println("Modified Array : " +
                Arrays.toString(months));
    }
}
public class MonthDemo {

    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

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

        // get index of current month
        int monthIndex = calendar.get(Calendar.MONTH);

        // array to keep the orderen month names
        String[] monthOrdered = new String[months.length];

        // create a stream with indexes for one year start with current month
        IntStream.range(monthIndex, monthIndex + 12)
                .sequential()
                // fill the ordered array
                .forEach(i -> monthOrdered[i - monthIndex] = months[i % 12]);
        System.out.println("monthOrdered = " + Arrays.toString(monthOrdered));
    }
}
monthOrdered = [August, September, October, November, December, January, \
    February, March, April, May, June, July]