无法创建特定对象的数组并且无法正确使用比较方法
unable to create an array of a specific object and unable to correctly use the compare to method
在这个项目中,我的目标是对有理数数组进行排序(我创建了一个允许这样做的有理数 class)。为了对数组进行排序,我必须为 class 编写一个 compareto 方法(我的 class 扩展了可比接口)。但是当我检查我的 compareto 方法时,它总是 returns 一个 0 值。此外,当我制作一个有理数 class 元素的数组时,程序只是在该点保持 运行 而不输出任何结果。我不明白为什么?下面是我的代码,其中还包括方法和部分:
public class MuhammadChaudryProject4 {
public static void main(String[] args) {
Rational a = new Rational(1, 4);
Rational b = new Rational(1, 8);
System.out.println(a + " + " + b + " = " + a.add(b));
System.out.println(a + " - " + b + " = " + a.sub(b));
System.out.println(a + " * " + b + " = " + a.mul(b));
System.out.println(a + " / " + b + " = " + a.div(b));
Rational[] arr = {new Rational(7, 1), new Rational(6, 1),
new Rational(5, 1), new Rational(4, 1),
new Rational(3, 1), new Rational(2, 1),
new Rational(1, 1), new Rational(1, 2),
new Rational(1, 3), new Rational(1, 4),
new Rational(1, 5), new Rational(1, 6),
new Rational(1, 7), new Rational(1, 8),
new Rational(1, 9), new Rational(0, 1)};
selectSort(arr);
for (Rational r : arr) {
System.out.println(r);
}
Number n = new Rational(7, 3);
System.out.println(n.doubleValue());
System.out.println(n.floatValue());
System.out.println(n.intValue());
System.out.println(n.longValue());
}
public static <T extends Comparable<? super T>> void selectSort(T[] array)
{
T temp;
int mini;
for (int i = 0; i < array.length - 1; ++i) {
mini = i;
for (int j = i + 1; j < array.length; ++j) {
if (array[j].compareTo(array[mini]) < 0) {
mini = j;
}
}
if (i != mini) {
temp = array[i];
array[i] = array[mini];
array[mini] = temp;
}
}
}
}
class Rational extends Number implements Comparable<Rational> {
private int num, denom;
public Rational(int num, int denom) {
this.num = num;
this.denom = denom;
reduce();
}
public Rational add(Rational o){
return new Rational((denom * o.num) + (o.denom * num), denom * o.denom);
}
public Rational sub(Rational o) {
return new Rational((o.denom * num) - (denom * o.num), denom * o.denom);
}
public Rational mul(Rational o) {
return new Rational(num * o.num, denom * o.denom);
}
public Rational div(Rational o) {
return new Rational(num * o.denom, denom * o.num);
}
private int gcd (int num, int denom)
{
while (num != denom)
if (num > denom)
num = num - denom;
else
denom = denom - num;
return num;
}
private void reduce() {
int common = gcd(Math.abs(num), denom);
num = num / common;
denom = denom / common;
}
public String toString() {
if (denom == 1) {
return(num + " ");
}
if (num == 0) {
return("0");
}
else {
return(num + "/" + denom);
}
}
public int compareTo(Rational a) {
if ((double)(this.num)/(double)(this.denom) > (double)(a.num)/(double)(a.denom) ){
return 1;
}
if ((double)(this.num)/(double)(this.denom) < (double)(a.num)/(double)(a.denom) ){
return -1;
}
else {
return 0;
}
}
public double doubleValue() {
return((double)num/denom);
}
public float floatValue() {
return((float)num/denom);
}
public int intValue() {
return((int)num/denom);
}
public long longValue() {
return((long)num/denom);
}
}
Update -- this code has the compareto fixed, thanks to @Izruo help
But when i checked my compareto method, it always returns a 0 value.
在计算 Rational
的实际值时,您执行以下操作:
double rational = (double) (this.num / this.denom);
对于 this.num
小于 this.denom
的任何星座,这将产生 0
,因为计算本身是在 integer
算法中完成的,结果被转换为double
.
要真正进行您想要的计算,您必须转换每个值,如下所示:
double rational = (double) this.num / (double) this.denom;
编辑
我只是试图 运行 您的代码忽略所有 eclipse 警告的错误。例如,每当我遇到编译时错误时,我通常不会尝试执行代码,因为我很确定可能会发生一些真正意想不到的事情。更多信息见下方 注意.
Also when I make an array of rational class elements, the program just keeps running at that point without outputting any results.
您的程序 运行 进入 int gcd(int num, int denom)
方法内部的无限循环,输入值 num = 0
和 denom = 1
。
为了解决这个问题,我建议将 0
值作为一种特殊情况处理,任何具有 num = 0
的值肯定是 (0 / x = 0
)。因此,在您的方法中,您应该添加这样的附加检查作为第一条语句:
if(num == 0) {
denom = 1;
return 0;
}
备注
class Rational
未实现一些抽象方法。我不知道为什么你的代码仍然能够 运行,尽管有编译错误。但是,我强烈建议修复这些错误,因此实施以下方法:
int intValue()
long longValue()
float floatValue()
double doubleValue()
这些只是转换方法,所以很容易实现。事实上, doubleValue()
方法的目的正是按照我在回答问题的第一部分时所解释的那样进行。其他方法类似。
在这个项目中,我的目标是对有理数数组进行排序(我创建了一个允许这样做的有理数 class)。为了对数组进行排序,我必须为 class 编写一个 compareto 方法(我的 class 扩展了可比接口)。但是当我检查我的 compareto 方法时,它总是 returns 一个 0 值。此外,当我制作一个有理数 class 元素的数组时,程序只是在该点保持 运行 而不输出任何结果。我不明白为什么?下面是我的代码,其中还包括方法和部分:
public class MuhammadChaudryProject4 {
public static void main(String[] args) {
Rational a = new Rational(1, 4);
Rational b = new Rational(1, 8);
System.out.println(a + " + " + b + " = " + a.add(b));
System.out.println(a + " - " + b + " = " + a.sub(b));
System.out.println(a + " * " + b + " = " + a.mul(b));
System.out.println(a + " / " + b + " = " + a.div(b));
Rational[] arr = {new Rational(7, 1), new Rational(6, 1),
new Rational(5, 1), new Rational(4, 1),
new Rational(3, 1), new Rational(2, 1),
new Rational(1, 1), new Rational(1, 2),
new Rational(1, 3), new Rational(1, 4),
new Rational(1, 5), new Rational(1, 6),
new Rational(1, 7), new Rational(1, 8),
new Rational(1, 9), new Rational(0, 1)};
selectSort(arr);
for (Rational r : arr) {
System.out.println(r);
}
Number n = new Rational(7, 3);
System.out.println(n.doubleValue());
System.out.println(n.floatValue());
System.out.println(n.intValue());
System.out.println(n.longValue());
}
public static <T extends Comparable<? super T>> void selectSort(T[] array)
{
T temp;
int mini;
for (int i = 0; i < array.length - 1; ++i) {
mini = i;
for (int j = i + 1; j < array.length; ++j) {
if (array[j].compareTo(array[mini]) < 0) {
mini = j;
}
}
if (i != mini) {
temp = array[i];
array[i] = array[mini];
array[mini] = temp;
}
}
}
}
class Rational extends Number implements Comparable<Rational> {
private int num, denom;
public Rational(int num, int denom) {
this.num = num;
this.denom = denom;
reduce();
}
public Rational add(Rational o){
return new Rational((denom * o.num) + (o.denom * num), denom * o.denom);
}
public Rational sub(Rational o) {
return new Rational((o.denom * num) - (denom * o.num), denom * o.denom);
}
public Rational mul(Rational o) {
return new Rational(num * o.num, denom * o.denom);
}
public Rational div(Rational o) {
return new Rational(num * o.denom, denom * o.num);
}
private int gcd (int num, int denom)
{
while (num != denom)
if (num > denom)
num = num - denom;
else
denom = denom - num;
return num;
}
private void reduce() {
int common = gcd(Math.abs(num), denom);
num = num / common;
denom = denom / common;
}
public String toString() {
if (denom == 1) {
return(num + " ");
}
if (num == 0) {
return("0");
}
else {
return(num + "/" + denom);
}
}
public int compareTo(Rational a) {
if ((double)(this.num)/(double)(this.denom) > (double)(a.num)/(double)(a.denom) ){
return 1;
}
if ((double)(this.num)/(double)(this.denom) < (double)(a.num)/(double)(a.denom) ){
return -1;
}
else {
return 0;
}
}
public double doubleValue() {
return((double)num/denom);
}
public float floatValue() {
return((float)num/denom);
}
public int intValue() {
return((int)num/denom);
}
public long longValue() {
return((long)num/denom);
}
}
Update -- this code has the compareto fixed, thanks to @Izruo help
But when i checked my compareto method, it always returns a 0 value.
在计算 Rational
的实际值时,您执行以下操作:
double rational = (double) (this.num / this.denom);
对于 this.num
小于 this.denom
的任何星座,这将产生 0
,因为计算本身是在 integer
算法中完成的,结果被转换为double
.
要真正进行您想要的计算,您必须转换每个值,如下所示:
double rational = (double) this.num / (double) this.denom;
编辑
我只是试图 运行 您的代码忽略所有 eclipse 警告的错误。例如,每当我遇到编译时错误时,我通常不会尝试执行代码,因为我很确定可能会发生一些真正意想不到的事情。更多信息见下方 注意.
Also when I make an array of rational class elements, the program just keeps running at that point without outputting any results.
您的程序 运行 进入 int gcd(int num, int denom)
方法内部的无限循环,输入值 num = 0
和 denom = 1
。
为了解决这个问题,我建议将 0
值作为一种特殊情况处理,任何具有 num = 0
的值肯定是 (0 / x = 0
)。因此,在您的方法中,您应该添加这样的附加检查作为第一条语句:
if(num == 0) {
denom = 1;
return 0;
}
备注
class Rational
未实现一些抽象方法。我不知道为什么你的代码仍然能够 运行,尽管有编译错误。但是,我强烈建议修复这些错误,因此实施以下方法:
int intValue()
long longValue()
float floatValue()
double doubleValue()
这些只是转换方法,所以很容易实现。事实上, doubleValue()
方法的目的正是按照我在回答问题的第一部分时所解释的那样进行。其他方法类似。