因此,我在创建实例方法以添加两个基于14的数字时遇到麻烦,我想知道是否有人可以提供帮助?我对Java有点陌生,但在整体上还是有些困惑。到目前为止,我已经有了将基于14的数字转换为以10为底的代码,然后需要添加它们并将其转换回以14为底。我想将它们全部放在一个实例类中,但是我觉得把一个实例类放进去实在太多了。
这是我要让客户端代码像这样的输入:
PokerNum sum = num1.add(num2);
import java.util.Scanner;
public class PokerNum{
String alienNum;
int num1, num2;
public PokerNum(String alienNum) throws IllegalArgumentException{
this.alienNum = alienNum;
String toUpper = alienNum.toUpperCase();
for (int i = 0; i < toUpper.length(); i++){
char c = toUpper.charAt(i);
if (!(Character.isDigit(c) || c == 'A' || c == 'J' || c == 'Q' || c == 'K')){
throw new IllegalArgumentException("invalid input");
}
}
}
// initialized at zero
public PokerNum() {
this.num1=0;
this.num2=0;
}
@Override public String toString(){
return PokerNum()+ " ";
}
//add pokernums
public PokerNum add(PokerNum another){
PokerNum num = new PokerNum();
this.num1 = another.num1;
this.num2 = another.num2;
public PokerNum convert(PokerNum pn){
char[] firstNum = num1.toCharArray();
int amountValue = 0;
int length = characters.length;
for (int index = 0; index < length; index++){
int symbolValue;
switch (characters[index]) {
case 'A':
symbolValue = 10;
break;
case 'J':
symbolValue = 11;
break;
case 'Q':
symbolValue = 12;
break;
case 'K':
symbolValue= 13;
break;
default:
symbolValue = characters[index] - 48;
}
amountValue += symbolValue*Math.pow(14, length - index - 1);
}
StringBuilder result1 = new StringBuilder();
while(amountValue > 0){
int digit = amountValue%14;
switch (digit) {
case 10:
result.insert(0, 'A');
break;
case 11:
result.insert(0, 'J');
break;
case 12:
result.insert(0, 'Q');
break;
case 13:
result.insert(0, 'K');
break;
default:
result.insert(0, digit);
}
amountValue-=digit;
amountValue/=14;
String firstValue = result1.toString();
}
}
char[] secNum = num2.toCharArray();
int amountValue2= 0;
int length = secNum.length;
for (int index = 0; index < length; index++){
int symbolValue;
switch (characters[index]) {
case 'A':
symbolValue = 10;
break;
case 'J':
symbolValue = 11;
break;
case 'Q':
symbolValue = 12;
break;
case 'K':
symbolValue= 13;
break;
default:
symbolValue = characters[index] - 48;
}
amountValue2+= symbolValue*Math.pow(14, length - index - 1);
}
StringBuilder result = new StringBuilder();
while(amountValue2> 0){
int digit = amountValue%14;
switch (digit) {
case 10:
result.insert(0, 'A');
break;
case 11:
result.insert(0, 'J');
break;
case 12:
result.insert(0, 'Q');
break;
case 13:
result.insert(0, 'K');
break;
default:
result.insert(0, digit);
}
amountValue2-=digit;
amountValue2/=14;
PokerNum secondValue = result.toString();
}
return firstValue + secondValue;
/*PokerNum sum = num1 +
PokerNum another.num2 =
return sum;*/
}
感谢提前提供帮助的人:)
答案 0 :(得分:1)
我相信您可以将其保存在一个实例中。一种建议是使用以下功能进行转换:
Integer.parseInt(String s, int radix)
Integer.toString(int i, int radix)
javadoc说产生的字符串将使用:
0123456789abcdefghijklmnopqrstuvwxyz
因此,如果我们选择radix = 14,它将具有0123456789abcd。
逻辑思想是将实际数字保持为int
,并在创建和打印输出时将String转换为String。我们只需保留成员变量num1
并删除成员变量alienNum
和num2
。
构造函数
您的带有String参数的构造函数似乎可以很好地进行错误检查。我们需要的只是将字符串转换为整数并将其存储在成员变量中。首先,我们需要将所有有效的字符串从AJQK
转换为ABCD
。此处的示例效率低下,但可以使您理解:
//alienNum = alienNum.replace('A', 'A'); // no need
alienNum = alienNum.replace('J', 'B');
alienNum = alienNum.replace('Q', 'C');
alienNum = alienNum.replace('K', 'D');
然后我们可以调用解析方法:
num1 = Integer.parseInt(alienNum , 14);
通过将num1
的值初始化为0,您的空arg构造函数已经可以了。
添加
加法中的方法不正确,因为它正在将当前值设置为加法。这里有三个对象:num
,this
和another
。您要将this
中的another
添加到num
中并返回num
。
num.num1 = this.num1 + another.num1;
输出
我假设输出将来自toString()
。在这种情况下,您要从整数转换为字符串,然后将其转换为正确的字符
String out = Integer.toString(num1, 14).toUpper();
//alienNum = alienNum.replace('A', 'A'); // no need
alienNum = alienNum.replace('B', 'J');
alienNum = alienNum.replace('C', 'Q');
alienNum = alienNum.replace('D', 'k');
您现在可能不需要转换方法。