我试图从之前创建的两个数组a和b创建第三个排序数组c;但是,我在合并方法中得到了几个错误,说"表达式的类型必须是数组类型,但它解析为OrdArray"。我已经好几个小时了,觉得我的大脑现在已经糊涂了。有人可以帮我吗?
class OrdArray
{
private long[] a; // ref to array a
private int nElems; // number of data items
//-----------------------------------------------------------
public OrdArray(int max) // constructor
{
a = new long[max]; // create array a
nElems = 0;
}
//-----------------------------------------------------------
public int size()
{ return nElems; }
//-----------------------------------------------------------
public int find(long searchKey)
{
int lowerBound = 0;
int upperBound = nElems-1;
int curIn;
while (true)
{
curIn = (lowerBound + upperBound ) / 2;
if (a[curIn] == searchKey)
return curIn; // found it
else if (lowerBound > upperBound)
return nElems; // can't find it
else // divide range
{
if (a[curIn] < searchKey)
lowerBound = curIn + 1; // it's in upper half
else
upperBound = curIn - 1; // it's in lower half
} // end else divide range
} // end while
} // end find()
//-----------------------------------------------------------
public void insert(long value) // put element into array
{
int j;
for (j = 0; j < nElems; j++) // find where it goes
if (a[j] > value) // (linear search)
break;
for (int k = nElems; k > j; k--) // move bigger ones up
a[k] = a[k-1];
a[j] = value; // insert it
nElems++; // increment size
} // end insert()
//-----------------------------------------------------------
public boolean delete(long value)
{
int j = find(value);
if (j == nElems) // can't find it
return false;
else // found it
{
for (int k = j; k < nElems; k++) // move bigger ones down
a[k] = a[k+1];
nElems--; // decrement size
return true;
}
} // end delete()
//-----------------------------------------------------------
public void display() // displays array contents
{
for (int j = 0; j < nElems; j++) // for each element,
System.out.print(a[j] + " "); // display it
System.out.println("");
}
//-----------------------------------------------------------
public static long[] merge(OrdArray a, OrdArray b)
{
long[] c = new long[a.nElems + b.nElems];
int i = 0, j = 0, k = 0;
while (i < a.nElems && j < b.nElems)
{
if (a.data[i] < b.data[j])
c[k++] = a.data[i++];
else
c[k++] = b.data[j++];
}
while (i < a.nElems)
c[k++] = a.data[i++];
while (j < b.nElems)
c[k++] = b.data[j++];
return c;
}
} // end class OrdArray
////////////////////////////////////////////////////////////////
class OrderedApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
OrdArray a, b, c; // reference to array
a = new OrdArray(maxSize); // create the array
b = new OrdArray(maxSize);
c = new OrdArray(maxSize);
a.insert(11);
a.insert(13);
a.insert(15);
a.insert(17);
a.insert(19);
a.insert(21);
a.insert(23);
a.insert(25);
a.insert(27);
a.insert(29);
b.insert(12);
b.insert(14);
b.insert(16);
b.insert(18);
b.insert(20);
b.insert(32);
b.insert(24);
b.insert(26);
b.insert(28);
b.insert(30);
OrdArray.merge(a,b);
System.out.print("Array a: ");
a.display();
System.out.println();
System.out.print("Array b: ");
b.display();
System.out.println();
System.out.print("Array c: ");
c.display();
System.out.println();
} // end main()
}// end class OrderedApp
答案 0 :(得分:1)
OrdArray
不是数组类型(尽管名称不同);因此,你不能像数组一样索引它。这个表达
a[i++]
其中a
是OrdArray
,没有任何意义。 Java没有为您提供一种为类定义自己的[]
运算符的方法(与C ++不同)。因此,您必须向OrdArray
添加一个方法以返回给定索引处的元素,例如
public long get(int index) { ...write the code... }
a.get(i++) // will then get the element at that index
虽然我不确定这是你想要的,但是你已宣布c
为int[]
且OrdArray
中的数组为{ {1}},所以我不确定你要做什么。
编辑:阅读完评论后,我意识到long[]
方法位于merge
类内。我以前错过了。既然如此,您就不需要添加OrdArray
方法;您可以直接访问get
参数的私有字段。在你的方法中:
OrdArray
您希望获得为每个public void merge(OrdArray a, OrdArray b)
声明的私有数组a
。如果你只使用OrdArray
,变量将引用a
,它不是一个数组(如上所述);要获得属于OrdArray
的{{1}},您需要说
long[] a
同样适用于OrdArray a
,
a.a[i++]
这对读者来说可能会让人感到困惑,因此我建议您提出一个更好的名称,这样您就不会调用两件事b
。也许是b.a[i++]
?
其他一些事项:您使用a
这样的结果:data
,这意味着merge
是一种实例方法,而c.merge(a,b)
就是您的实例经营。但是你的方法对当前实例没有做任何事情。 (您在merge
中声明的c
是一个局部变量,与您在调用c
时使用的merge
无关。)现在,您的方法将转到构造本地数组c
会有很多麻烦,但之后它就会抛弃它。您需要(1)修复方法,以便在当前实例中设置merge
(或c
)数组;或(2)使其成为a
方法,并使该方法返回新数组作为函数结果。我不确定你的导师要你做哪一个。
答案 1 :(得分:1)
我不确定你要做什么。但为了解决错误,我已经纠正了关节阻滞。
要注意,OrdArray
类不是数组。这是一个有long[] a
的班级。因此,您需要像对象中的任何其他属性一样获取数组。
为了改善,请更改方法签名,如下所示:
public void merge(OrdArray ordArr1, OrdArray ordArr2) {//Note parameters' name change
.
.
.
while (i < ordArr1.nElems && j < ordArr2.nElems)
{
if (ordArr1.a[i] < ordArr2.a[j]) //should resolve
c[k++] = ordArr1.a[i++];
else
c[k++] = ordArr2.a[j++];
}
while (i < a.nElems)
c[k++] = ordArr1.a[i++];
while (j < b.nElems)
c[k++] = ordArr2.a[j++];
}
答案 2 :(得分:0)
我很困惑你为什么要使用二进制搜索。简单的方法是使用两个插入方法或一个插入两个数组。使用合并方法,通过比较两个已排序数组中的最小元素,合并这两个已排序的数组。
删除删除,搜索等方法,不需要它们。
这是我的代码。我已经将两个整数数组(元素)插入到inserta()和insertb()中,并使用insert()方法对它们进行排序。最后,我将这些排序后的数组合并后。请在此处查看我的代码:
package sample;
/**
*
* @author Shivasai
*/
public class Merge {
int i;
int j;
int k;
int n;
int m;
int p;
private long[] a;
private long[] b;
private long[] c;
public Merge()
{
a=new long[10];
b=new long[10];
c=new long[100];
n=0;
m=0;
p=0;
}
void inserta(long key)
{
for(i=0;i<n;i++)
{
if(a[i]>key)
break;
}
for(j=n;j>i;j--)
{
a[j]=a[j-1];
}
a[j]=key;
n++;
}
void insertb(long value)
{
for(i=0;i<m;i++)
{
if(b[i]>value)
break;
}
for(j=m;j>i;j--)
{
b[j]=b[j-1];
}
b[j]=value;
m++;
}
void insert()
{
i=0;
j=0;
while(i>n || j<m)
{
if(a[j]<b[i])
{
c[p]=a[j];
j++;
p++;
}
else
{
c[p]=b[i];
i++;
p++;
}
}
}
void displaya()
{
for(k=0;k<10;k++)
{
System.out.print("," +a[k]);
}
System.out.println();
}
void displayb()
{
for(k=0;k<10;k++)
{
System.out.print("," +b[k]);
}
System.out.println();
}
void displayc()
{
for(k=0;k<20;k++)
{
System.out.print("," +c[k]);
}
}
public static void main(String[] args)
{
Merge obj = new Merge();
obj.inserta(25);
obj.inserta(12);
obj.inserta(1800);
obj.inserta(9);
obj.inserta(10);
obj.inserta(15);
obj.inserta(18);
obj.inserta(19);
obj.inserta(0);
obj.inserta(1500);
obj.insertb(36);
obj.displaya();
obj.insertb(2);
obj.insertb(3);
obj.insertb(2000);
obj.insertb(5);
obj.insertb(6);
obj.insertb(7);
obj.insertb(8);
obj.insertb(21);
obj.insertb(85);
obj.displayb();
obj.insert();
obj.displayc();
}
}
答案 3 :(得分:0)
如果您接受解决方案,请列出:
List<Integer> result = new ArrayList<Integer>(Arrays.asList(sourceArray));
result.addAll(Arrays.asList(secondSourceArray));
Collections.sort(result);
您可以选择使用
将其转换回数组result.toArray();