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

时间:2015-09-08 03:33:35

标签: java arrays

我试图从之前创建的两个数组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

4 个答案:

答案 0 :(得分:1)

OrdArray不是数组类型(尽管名称不同);因此,你不能像数组一样索引它。这个表达

a[i++]

其中aOrdArray,没有任何意义。 Java没有为您提供一种为类定义自己的[]运算符的方法(与C ++不同)。因此,您必须向OrdArray添加一个方法以返回给定索引处的元素,例如

public long get(int index) { ...write the code... }

a.get(i++) // will then get the element at that index

虽然我不确定这是你想要的,但是你已宣布cint[]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();