Java编码问题-System.out.println输出中文乱码

想学一学Java。拿出雍俊海老师的《Java程序设计教程》,将第一个例程代码敲上去:

//J_HelloJava.java
public class J_HelloJava {
	public static void main(String args[]) {
		System.out.println("Java语言,您好!");
		System.out.println("我将成为优秀的Java程序员!");
	}
}

编译:

javac J_HelloJava.java

运行:

java J_HelloJava

结果出来一堆乱码,上网搜索找到原因,我的J_HelloJava.java文件保存的时候是用UTF-8编码保存的,而javac编译的时候是以电脑系统编码(GBK,我是win 7系统)来处理的,搞清楚这点后,就不难处理了。针对上述问题,有两种解决方法:

1、将 J_HelloJava.java 以 GBK 编码方式存储,然后再编译、运行。

2、编译时指定编码为UTF-8,编译命令:

javac -encoding utf-8 J_HelloJava.java

推荐一篇文章,讲Java编码问题的,我就是看这篇文章解决问题的。我没认真看,粗略地看了一下,解决了我目前的这个问题。

地址:http://www.cnblogs.com/cy163/archive/2008/08/13/1267433.html

(原博客发布时间:2012-01-03 20:25:15)

插入排序和希尔排序执行效率的比较

现在晚上睡觉之前都会看一会讲算法的书。因为大三的时候,没有怎么好好学习过算法,而之前C/C++也一直没认真上过课,所以这次看书也像新学一样从头开始看。最先讲的算法肯定是排序算法。冒泡算法还是一看就明白了,插入也能看明白,但希尔算法看了两个晚上也没能搞明白。今天终于通过代码实现了。希尔算法也是基于插入排序算法的,但比简单的插入排序效率要高很多。当待排序数目更多时,效率高得更明显。以下是完整C源代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define NUM 1000

void insertSort(int * a, int len) {
    int i, j, t, countChange = 0;//countChange记录数据移动次数
//    int k = 0;
    for(i = 1; i < len; i++) {
        t = a[i];
        j = i-1;
        while(j >= 0 && t < a[j]) {
            a[j+1] = a[j];
            j--;
            countChange++;
        }
        a[j+1] = t;
//        k++;
//      printf("第%d次排序后的结果:", k);//显示第k次排序后的结果
//        for(j = 0; j < len; j++)
//            printf("%d ", a[j]);
//        printf("\n");
    }
    printf("完成排序一共移动数据次数:%d\n", countChange);
}

void shellSort(int * a, int len) {
    int i, j, r, t, countChange = 0;
//    int k = 0;
    for (r = len/2; r >= 1; r /= 2) {
        for (i = r; i < len; i++) {
            t = a[i];
            j = i-r;
            while (j >= 0 && t < a[j]) {
                a[j+r] = a[j];
                j -= r;
                countChange++;
            }
            a[j+r] = t;
//            k++;
//            printf("第%d排序后的结果:", k);
//            for (j = 0; j < len; j++)
//                printf("%d ", a[j]);
//            printf("\n");
        }
    }
    printf("完成排序一共移动数据次数:%d\n", countChange);
}

int main()
{
    int a[NUM], b[NUM], i;
    srand(time(NULL));//设置随机种子

    for(i = 0; i < NUM; i++)//随机生成数组数据
        a[i] = b[i] = rand();

    printf("Before sorting: ");//输出排序前的数据序列
    for(i=0; i<NUM; i++)
        printf("%d ", a[i]);

    printf("\n\n插入排序:\n");
    insertSort(a, NUM);

    printf("\n希尔排序:\n");
    shellSort(b, NUM);
    printf("\n");

    printf("After sorting: ");//输出排序后的数据序列
    for(i=0; i<NUM; i++)
        printf("%d ", a[i]);

    printf("\n");
    return 0;
}

 

去除代码注释可以查看每次排序后的结果。

当数组规模为10时,希尔排序数据移动次数只有插入排序的一半;当数组规模为100时,插入排序需要移动次数大概是希尔排序的5倍;当数组规模为100时,插入排序需要移动次数大概是希尔排序的30倍。

(原博客发布时间:2011-10-27 14:03:51)

Foreign key constraint is incorrectly formed

朋友,如果你也遇到了这个问题,建立外键的字段必须和引用表的字段一模一样的类型,请用 show create table table_name 查看是否一致。

今天在给一个表建外键的时候出现如题所示错误。

情况是这样的。我有一个bysj_student表,结构如下:

CREATE TABLE `bysj_student` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`stuno` VARCHAR(20) NOT NULL,
	`name` VARCHAR(20) NOT NULL,
	`gender` VARCHAR(2) NOT NULL,
	`major_id` INT(11) UNSIGNED NOT NULL,
	`tel` VARCHAR(11) NOT NULL,
	`email` VARCHAR(50) NOT NULL,
	PRIMARY KEY (`id`)
)

还有另一个bysj_stu_sub表,结构如下:

CREATE TABLE `bysj_stu_sub` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`student_id` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `student_id` (`student_id`),
	CONSTRAINT `bysj_stu_sub_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `bysj_student` (`id`)
)

bysj_stu_sub表里的student_id是bysj_student表的外键,但是在创建bysj_stu_sub表时,会提示错误:

SQL Error (1005): Can't create table 'test.bysj_stu_sub' (errno: 150)  Foreign key constraint is incorrectly formed

网上搜索之后才明白,建立外键的字段必须和引用表的字段一模一样的类型
于是将bysj_stu_sub表的student_id字段属性改为

`student_id` INT(11) UNSIGNED NULL DEFAULT NULL

再建表就没有问题了。

(原博客发布时间:2011-11-27 09:27:26)

Java学习笔记-接口

1、任何子类只能有一个直接父类,但允许一个类实现多个接口;

2、接口的所有成员域都具有public、static、和final属性:例如在接口体内部定义

double PI = 3.14159265358979323846;

或者

public static final double PI = 3.14159265358979323846;

上面两个成员域的定义是等价的。它们都具有public、static、和final属性;

3、接口的所有成员方法都具有public和abstract属性;

总结:我怎么感觉接口就是一种特殊的类啊?我是这么理解的。

(原博客发布时间:2012-01-04 15:24:21)

八皇后问题,通过回溯,用Java实现

八皇后问题是:在八行八列的格子上放8个皇后(棋子),使得任意两个皇后都攻击不到对方,即使得他们都不在同一行同一列和同一斜线上。

记得以前学C语言的时候,就见过这个问题,但当时怎么都弄不懂。现在看Java的书,书上课后练习有这个题目,就上网搜了一下怎么做,现在终于差不多懂了。代码和注释如下:

public class BackTrackQueen {

	private int[] s; // 记录皇后放置情况,s[i] = w表示皇后放在第i行的第w列(从下标0开始计数)
	private int m_queenNum; // 皇后个数
	private int m_solution; // 解的个数

	public BackTrackQueen(int queenNum) {
		m_solution = 0;
		m_queenNum = queenNum;
		s = new int[queenNum];
		for (int i = 0; i < queenNum; i++) {
			s[i] = -1;
		}
	}

	/**
	 * printThis()输出解,即打印皇后的放置情况
	 */
	public void printThis() {
		System.out.println("第" + m_solution + "种解法:");
		for (int i = 0; i < m_queenNum; i++)
			System.out.println("第" + (i + 1) + "行的第" + (s[i] + 1) + "列");
	}

	/**
	 * check()判断是否满足条件; 注意,因为每个s[i]只能等于一个值,也就限定了每行只有一个皇后,
	 * 所以,不用再判断同一行是否有2个皇后。
	 * 
	 * @param n
	 * @return boolean
	 */
	public boolean check(int n) {
		for (int i = 0; i < n; i++) {
			if (s[i] == s[n]) // 判断是否存在2个皇后在同一列
				return false;
			if (Math.abs(s[n] - s[i]) == n - i)// 判断是否存在2个皇后在同一斜线上
				return false;
		}
		return true;
	}

	/**
	 * queen()核心函数,实现把所有的满足题义的情况列出来
	 * 
	 * @param n
	 */
	public void queen(int n) {
		if (m_queenNum == n) {// 如果所有皇后都放置完毕,则输出当前解
			m_solution++;
			printThis();
			return;
		} else {
			for (int i = 0; i < m_queenNum; i++) {
				s[n] = i; // 将第n个皇后放在第n行的i列,如果满足check(n)为真,则继续放置下一个皇后
				if (check(n)) // 否则i++,继续(从下标0计数,这里的第n个,其实是现实中的第n+1个)
					queen(n + 1);
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BackTrackQueen btq = new BackTrackQueen(8);//声明类的时候给定皇后个数为8,8皇后问题,也可以是N皇后问题
		btq.queen(0);
	}

}

 

参考文章:http://blog.csdn.net/lixiaoshan_18899/article/details/1286716

(原博客发布时间:2012-01-06 13:39:10)

更改IE查看源文件程序

开始-运行(或者按Windows+R组合键)输入 regedit 回车,打开注册表编辑器。

编辑这个值:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name

(原博客发布时间:2012-03-27 12:10:00)

不能给内联元素设置宽度和高度

昨天在用CSS写一个导航栏的时候,为了让链接的可点击区域变大,我给a元素设置了宽度width 和高度height ,但是发现没有效果,今天搜索块级元素和内联元素时才知道,原来是因为给内联元素设置宽度和高度没有效啊。

(原博客发布时间:2012-03-28 16:13:55)

声明不同,导致ul下li的list-style显示属性不一样

今天在做一个导航栏时发现一个奇怪的问题,两个html文件的body内容一样,引入的是同一个CSS文件,但是一个的ul下li显示有圆点,另一个却不显示圆点。经过仔细对比才发现两个html文件的<!DOCTYOE>声明不同。一个是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

另一个是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

不知道为什么会这样,谁能解答下?

附html文件内容和CSS文件内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>首页</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body >
<div id="index_area2">
	<ul class="main_menu">
		<li class="item_text"><a href="#">导航1</a></li>
		<li class="item_text"><a href="#">导航2</a></li>
		<li class="service_text"> </li>
	</ul>
</div>
</body>
</html>

 

@charset "utf-8";
/* CSS Document */

* { margin: 0; padding: 0; }

body {
	text-align: center; /* for IE */
	background-color: #EEE;
}

div#index_area2{
	clear: both;
	margin: 0 auto;
	width: 975px;
}

div#index_area2 ul.main_menu{
	height:auto;
	background-color:#47B9EA;
}

div#index_area2 ul.main_menu li.item_text{
	float:left;
	background-color:#47B9EA;
}

div#index_area2 ul.main_menu li.item_text a{
	display:block;
	font-family:Arial, Helvetica, sans-serif;
	font-size:0.8em;
	color:#FFFFFF;
	text-decoration:none;
	line-height: 3em;
	width: 120px;
	border-right: solid 1px #FFF;
	vertical-align: middle;
}

div#index_area2 ul.main_menu li.item_text a:hover{
	background-color:#003C63;
}

div#index_area2 ul.main_menu li.service_text {
	display:block;
	font-family:Arial, Helvetica, sans-serif;
	font-size:0.8em;
	color:#FFFFFF;
	text-decoration:none;
	line-height: 3em;
	padding-left: 30px;
	vertical-align: middle;
	height: 38px;
}

(原博客发布时间:2012-04-08 15:20:30)

ubuntu 恢复删除的图标文件

今天在ubuntu上安装了kubuntu-desktop,用了一会,又觉得不爽,就将kubuntu-desktop给卸载了。重启再进入gnome桌面,发现鼠标指针还是kde下的那个样式,总觉得不爽,想换过来,但在外观里面设置还是没能解决问题。于是,去想干脆将所有的主题元素都删除后在再重新安装一遍ubuntu-desktop。找到了外观资源存放的文件夹。为以下两个目录:

/usr/share/icons
/etc/X11/cursors

我将这两个文件夹下的文件全部删除了。结果所有软件的图标都没有了,包括系统图标,左上角的ubuntu的logo,总之就是都没有了。然后运行:

sudo aptitude reinstall ubuntu-desktop

还是那样,没能解决问题。

后来上网解决了,运行如下两条命令就行了:

sudo aptitude reinstall `dpkg -S /usr/share/icons | cut -d: -f1 | sed 's/,//g'`
sudo aptitude reinstall `dpkg -S /etc/X11/cursors | cut -d: -f1 | sed 's/,//g'`

图标恢复之后,然后在外观里设置鼠标的样子,重启后一切都恢复了。

(原博客发布时间:2012-04-13 20:05:55)

MySQL UNION 用法

有这样两张表 post 和 postmeta。

表 post 结构如下

CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
)

表 postmeta 结构如下

CREATE TABLE `postmeta` (
  `meta_id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL,
  `meta_key` text NOT NULL,
  `meta_value` text NOT NULL,
  PRIMARY KEY (`meta_id`)
)
INSERT INTO `postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES
(1, 1, 'count_views_all', '666'),
(2, 1, 'count_views_day-20130117', '44'),
(3, 1, 'count_views_week-201301', '343'),
(4, 2, 'count_views_all', '3453'),
(5, 3, 'count_views_all', '34553'),
(6, 4, 'count_views_all', '553'),
(7, 3, 'count_views_day-20130117', ''),
(8, 4, 'count_views_day-20130117', '35'),
(9, 5, 'count_views_day-20130111', '5'),
(10, 5, 'count_views_day-20130112', '12'),
(11, 5, 'count_views_day-20130113', '34'),
(12, 5, 'count_views_day-20130114', '45'),
(13, 5, 'count_views_day-20130115', '21'),
(14, 5, 'count_views_day-20130116', '23'),
(15, 5, 'count_views_day-20130117', '65');

想获取所有文章,并且按全部阅读量排序,理所当然,我写出了这样的查询语句:

SELECT `post`.*,`views_count` FROM `post`
JOIN
SELECT `meta_value` AS `views_count` WHERE `meta_key`='count_views_all' FROM `postmeta`
ON `post`.`id`=`postmeta`.`post_id`
ORDER BY `views_count` DESC

运行,提示 SQL 语法错误。查看 MySQL 官方文档,总结出 JOIN 两边必须是表(有错还希望看官您指出),因此,我加了一个子句。如下,OK。

SELECT `post`.*,`views_count` FROM `post`
JOIN
(SELECT `post_id`,`meta_value` AS `views_count` FROM `postmeta` WHERE `meta_key`='count_views_all') AS `meta`
ON `post`.`id`=`meta`.`post_id`
ORDER BY (`views_count`+0) DESC