编写一个截取字符的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但是要保证汉字不被截半个,如(“我ABC”,4),应该截为“我AB”,输入为(“我ABC汉DEF”,6),应该截为“我ABC”,而不是“我ABC+汉的一半”编写一个应用程序,用户用键盘键入5个学生的分数,程序按照成绩排序输出学生的姓名和分数,要求用Student类封装学生的相关信息,输入5个Student类对象利用vector工具类保存并进行排序及遍历输出
解决方案 »
- 发布一个Java写的俄罗斯方块源码 算法简单(300行) 注释详细
- Thinking in java 4e Chapter2 Exercise4
- 关于内部类的一个问题
- 请教一个swing线程的问题
- 急!!关于java.security.java.security.AccessControlException: access denied
- java发送email出问题请帮忙解释一下!
- 我在编译chkregister.jsp的时候系统提示我使用了未经检查或是不安全的操作,请高手帮我看看该如何改代码代码吧.谢谢赐教!!!
- 大家帮帮我呀,我刚毕业,编程总是碰到问题
- 高分求助原代码!!用java做画几何图形,用鼠标能拖放,设置控制点后能改变形状,来者有分!!!!
- 几个问题请教!
- JDBC连SQL Server的乱码问题!急!!!
- about "this"
第二个简单,只要Student按分数定义Comparator接口就可以用list排序然后输出了
public class CutStr{
public static String cutString(String s , int i){
int j=0;
byte[] sb=s.getBytes();
for (int m=0; m<i ;m++ )
if (sb[m]<0) j++;
i=i-(j+1)/2;
i= i>0?i:0;
return s.substring(0,i);
}
public static void main(String[] args){
System.out.println( cutString("a我是fghj",4) );
}
}
import java.util.*;
import java.io.*;public class Student implements Comparable{
private String name ="";
private double score = 0;
public Student (String name, double score){
this.name = name;
this.score = score;
}
public String getName(){
return name;
}
public double getScore(){
return score;
}
public int compareTo(Object o1){
Student s1 = (Student)o1;
if ( this.score > s1.getScore() ) return 1;
if ( this.score < s1.getScore() ) return -1;
return 0;
}
public static void main(String[] args){
Vector stuVector = new Vector();
try
{
BufferedReader in =
new BufferedReader(
new InputStreamReader(System.in));
Student s;
String s1="";
String s2="";
System.out.println("Please input the 5 students' name and score!");
for (int i=0; i<5; i++){
s1 = in.readLine() ;
s2 = in.readLine() ;
s = new Student(s1, Double.valueOf(s2).doubleValue());
stuVector.add(s);
System.out.println(" a student added! name:"+ s1 + " score:"+s2);
} }
catch(Exception e)
{
e.printStackTrace();
}
Collections.sort(stuVector);
System.out.println("The ordered Student name:");
for(int i = 0;i<stuVector.size();i++){
Student s = (Student)stuVector.get(i);
System.out.println(" " + s.getName());
}
}
}
在这里为什么中文 也就是sb[2] sb[3]...是负数啊?
字符既可以用16位的char表示,也可以用两个8位的byte表示阿,在Java里可以互相转换的,比如"一"可以用(char)19968或byte的-46加上-69表示
中文用byte表示的话需要两位,且第一位大约在-127到-3之间,必小于0
中文的byte第一位是1,所以是负数
“第一个
public class CutStr{
public static String cutString(String s , int i){
//int j=0;
byte[] sb=s.getBytes();
//for (int m=0; m<i ;m++ )
// if (sb[m]<0) j++;
//i=i-(j+1)/2;
//i= i>0?i:0;
//上面这些都不需要,只需加一句
if(sb[i]<0) i--;
return s.substring(0,--i);
}
public static void main(String[] args){
System.out.println( cutString("a我是fghj",4) );
}
}
public static String cutString(String s , int i){
//int j=0;
byte[] sb=s.getBytes();
//for (int m=0; m<i ;m++ )
// if (sb[m]<0) j++;
//i=i-(j+1)/2;
//i= i>0?i:0;
//上面这些都不需要,只需加一句
if(sb[i]<0) i--;
return s.substring(0,--i);
}
public static void main(String[] args){
System.out.println( cutString("a我是fghj",4) );
}
}
如果输入得值大于字符数组得长度,没有判断,
这样功能会更强一些.---初学者
wangzhisheshou(王之射手) 为取i 个byte想想挺难搞的,又犯糊涂了.---初学者
必须要检查i前面的汉字数
因为是一个汉字要算2个byte,而题目要求以byte计数你的方法如果 输入是
System.out.println( cutString("我我是fghj",5) );
则输出是“我我是”结果和题意不符
你的方法效率不高啊.---初学者
应该怎么样呢?
给个解决方法好吗
if(sb[i]<0) i--;
return s.substring(0,--i);
方法有问题:
如果输入的是: cutString("abc方法测试defghijkl", 12)
输出的将是: abc方法测试defgh
而题意应该是: abc方法测试d
写的是错误的!用cutString(“我是射手”,4)即可以测试一下!
public static String cutString(String s , int i){
byte[] sb=s.getBytes();
if (i < sb.length) { //长度判断
return new String(sb, 0, i); //这样根本就不需要减来减去的
} else {
return s;
}
}
public static void main(String[] args){
System.out.println( cutString("a我是fghj",4) );
}
}
public static String cutString(String s , int i){
byte[] sb=s.getBytes();
if (i < sb.length) { //长度判断
return new String(sb, 0, (sb[i]<0?(i-1):i));
} else {
return s;
}
}
public static void main(String[] args){
System.out.println( cutString("a我是fghj",4) );
}
}
short才是2个字节~
还有,第一题应该是要我们自己输入数据吧,而不是指定的数据……
二楼的方法应该是没问题的public class CutStr{
public static String cutString(String s , int i){
byte[] sb=s.getBytes();
if (i < sb.length) {
boolean b = true;
for (int j=0; j<i; j++) {
if (sb[j]<0) b = !b; //如果有半个汉字则b为false
}
return new String(sb, 0, (b?i:(i-1)));
} else {
return s;
}
}
public static void main(String[] args) { System.out.println( cutString("a我是fghj",4) );
}
}另外 to shallat(艾劲):
你对函数的输入输出有所误解,函数的输入不是指自己输入数据,而是指函数的参数,函数的输出是指函数的返回值
public class Test
{
public String change(String str, int num)
{
char[] ch = new char[num];
int j = 0;
for (int i=0; i<str.length(); i++)
{
int b = (int)str.charAt(i);
if (b > 128)
{
j += 2;
if (j < num+1)
ch[i] = str.charAt(i);
}
else
{
j += 1;
if (j < num+1)
ch[i] = str.charAt(i);
}
}
return new String(ch);
} public static void main(String[] args)
{
String s = "我ABC汉DEF";
System.out.println(new Test().change(s, 6));
}
}
简单说明一下,一般英文的字符的ASCII码是小于128。
新手,所以思路简单,但是代码太长。
public class CutString {
public static void main(String args[]) {
String str="我喜欢JAVA:)";
for(int i=0;i<=str.length();i++) {//循环打印
System.out.println(cutString(str,i));
}
}
public static String cutString(String s,int len) {
byte [] sb=s.getBytes();
boolean b=true;
for(int i=0;i<len;i++) {
if(sb[i]<0 && b==true) {//遇到汉字len++
len++;
b=false;
}else{
b=true;
}
}
return new String(sb,0,len);
}
}
int i;
for (i = 0; i < n; i++) {
if (str.charAt(i) > 127)
n--;
}
return str.substring(0, n);
}女生写的,呵呵
好,这个应该是最简单的了