月度归档:2016年01月

本月的日期生成器[Java实现]

一天都在dfs,bfs里晕着,好容易训练完了,赶快看几眼Java的书清醒一下,已经度过了学习Java程序基本结构的苦逼岁月,简单的利用Java的有关日期的GregorianCalendar类写了一个简单的日历程序。

[java]
package core_Java;

import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
GregorianCalendar d =new GregorianCalendar(); //构建了一个日历对象
int today=d.get(Calendar.DAY_OF_MONTH); //此时的日
int month=d.get(Calendar.MONDAY); //此时的月
d.set(Calendar.DAY_OF_MONTH, 1); //把d设置为这个月的第一天
int weekday=d.get(Calendar.DAY_OF_WEEK); //此时为星期几
int firstDayOfWeek=d.getFirstDayOfWeek(); //一周的起始日为星期几
int indent=0; //缩进
/*解决星期几的缩进问题*/
while(weekday!=firstDayOfWeek){
indent++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday=d.get(Calendar.DAY_OF_WEEK);
}
/*得到星期的缩写字符串,数组用星期数作为索引*/
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do{
System.out.printf("%4s",weekdayNames[weekday]);
d.add(Calendar.DAY_OF_MONTH, 1);
weekday=d.get(Calendar.DAY_OF_WEEK);
} while(weekday!=firstDayOfWeek);
System.out.println();
for(int i=1;i<=indent;i++) System.out.print(" ");
d.set(Calendar.DAY_OF_MONTH, 1); //回到当月起始日
do{
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
if(day==today) System.out.print("*");
else System.out.print(" ");
d.add(Calendar.DAY_OF_MONTH, 1);
weekday=d.get(Calendar.DAY_OF_WEEK);
if(weekday==firstDayOfWeek) System.out.println(); //满一星期后跳转至下一行
} while(d.get(Calendar.MONTH)==month);
if(weekday!=firstDayOfWeek) System.out.println();
}

}
[/java]

写的时候就觉得Java关于日期的类不是很好用,主要就是练习一下更改器方法和访问器方法,后来在网上查了一查才发现Java8果然在日期这一块做了一些改动,使用起来比较好用了。详情戳这里
附上eclipse console里的简陋效果图(打*为程序运行的日期,接着看搜索去了):
QQ图片20160126205352

再次总结Java数组

上次总结的时候其实只总结了Java数组是一种引用数据类型以及一个array.length的属性,还是很不全面。

1.Java中提供一种创建数组对象并同时赋予初始化的简化形式。int [] array={1,2,3,4,5};这样就不用再new啦。我们甚至还可以通过使用匿名数组的方式在不创建新变量的同时重新初始化一个数组。array=new int[]{6,7,8,9};同时Java中允许数组长度为0,int[] b=new int[0];这样的格式是完全合法的。同时数组长度不再要求是常量。

2.我们可以使用foreach循环来遍历打印数组中的所有值,也可以利用Arrays类的toString方法。例如:

[java]System.out.println(Arrays.toString(a));[/java]

3.在上次的总结中也提了将一个数组变量拷贝给另一个数组变量,这时两个变量将引用同一个数组。如果希望将一个数组的所有值拷贝到另一个新数组中,需要使用Array.copyOf方法。通过这个方法我们可以增加原有数组的长度。

[java]a=Arrays.copyOf(a, 2*a.length);[/java]

常用API…还是看文档比较好。sort(快排),binarySearch(二分查找),fill…

Java的大数值

这几天一直在跟着学习ACM的算法,也是尽量不让自己掉队吧,所以在那方面花的时间比较多。但是也不能拖项目的后腿啊,赶快挤时间看了看Java的书,学习了一下Java.math这个包中两个很有用的类:BigInteger,BigDecimal.前者用来处理任意精度的整数运算,而后者则运用在浮点数当中。

使用静态方法valueOf()方法即可将普通的数值转化为大数值。但是对于Java的大数值我们不能在使用中算术运算符了,而只能使用add,subtract等方法进行和差计算。

贴一个core_java中的例子程序(再也不用手写大数计算啦…):

[java]
package core_Java;

import java.math.BigInteger;
import java.util.Scanner;

public class BigIntegerTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
System.out.println("How many numbers do you need draw? ");
int k=in.nextInt();
System.out.println("What’s th highest number you can draw?");
int n=in.nextInt();
BigInteger lotteryOdds = BigInteger.valueOf(1);
for(int i =1;i<=k;i++)
lotteryOdds=lotteryOdds.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));
System.out.println("Your odds are 1 in " + lotteryOdds+".Good luck!");
}

}
[/java]

常用的API:

static BigInteger valueOf(long x)   返回值等于X的大整数

BigInteger add(BigInteger other)     加法

BigInteger subtract(BigInteger other)      减法

BigInteger multiply(BigInteger other)      乘法

BigInteger  divide(BigInteger other)     除法

BigInteger  mod(BigInteger  other)   求余

int compareTo(BigInteger other)    相等返回0,比other大返回正数(1),否则返回负数(-1)