如何在Java中合并两个排序数组?
我试图从前面创建的两个数组a和b中创建第三个排序数组c;但是,我在merge方法中遇到了几个错误,它们说“表达式的类型必须是数组类型,但它解析为OrdArray”。我已经做了好几个小时了,现在觉得我的脑子乱糟糟的。有人能帮我吗如何在Java中合并两个排序数组?,java,arrays,Java,Arrays,我试图从前面创建的两个数组a和b中创建第三个排序数组c;但是,我在merge方法中遇到了几个错误,它们说“表达式的类型必须是数组类型,但它解析为OrdArray”。我已经做了好几个小时了,现在觉得我的脑子乱糟糟的。有人能帮我吗 class OrdArray { private long[] a; // ref to array a private int nElems; // number of data items
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
类数组
{
private long[]a;//对数组a的引用
private int nElems;//数据项的数量
//-----------------------------------------------------------
公共OrdArray(int max)//构造函数
{
a=新长[max];//创建数组a
nElems=0;
}
//-----------------------------------------------------------
公共整数大小()
{返回nElems;}
//-----------------------------------------------------------
公共整数查找(长搜索键)
{
int lowerBound=0;
int上限=nElems-1;
int-curIn;
while(true)
{
库林=(下界+上界)/2;
if(a[curIn]==搜索键)
return curIn;//找到了
else if(下限>上限)
return nElems;//找不到它
else//划分范围
{
if(a[curIn]值)/(线性搜索)
打破
对于(int k=nElems;k>j;k--)//向上移动较大的
a[k]=a[k-1];
a[j]=value;//插入它
nElems++;//增量大小
}//结束插入()
//-----------------------------------------------------------
公共布尔删除(长值)
{
int j=查找(值);
if(j==nElems)//找不到它
返回false;
我找到了
{
对于(int k=j;k
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
中的数组为long[]
,所以我不确定您要做什么
编辑:阅读您的评论后,我意识到merge
方法在OrdArray
类中。我以前错过了。既然如此,就不需要添加get
方法;您可以直接访问OrdArray
参数的私有字段。在您的方法中:
public void merge(OrdArray a, OrdArray b)
您希望获取为每个OrdArray
声明的私有数组a
。如果只使用a
,变量将引用OrdArray
,它不是数组(如上所述);要获取属于或数组a
的长[]a
,您需要说
a.a[i++]
及
b.a[i++]
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++];
}
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();
}
}
List<Integer> result = new ArrayList<Integer>(Arrays.asList(sourceArray));
result.addAll(Arrays.asList(secondSourceArray));
Collections.sort(result);
result.toArray();