如何在Java中合并两个排序数组?

如何在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

我试图从前面创建的两个数组a和b中创建第三个排序数组c;但是,我在merge方法中遇到了几个错误,它们说“表达式的类型必须是数组类型,但它解析为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
类数组
{
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();