将C方法转换为Java(Android Studio)

将C方法转换为Java(Android Studio),java,c#,android-studio,Java,C#,Android Studio,这是我试图转换的C代码 ArrayList.BinarySearch(Object, IComparer) 它所做的是将节点类对象与比较类对象进行比较,并返回-1、0或正整数。 我已经搜索了很多,并试图用java转换它,但不能这样做。我需要一个方法,说明,库或任何可以帮助我实现它 一班 { SortedNode类别为: public class SortedCostNodeList { ArrayList _list; NodeComparer _nodeComparer;

这是我试图转换的C代码

ArrayList.BinarySearch(Object, IComparer)
它所做的是将节点类对象与比较类对象进行比较,并返回-1、0或正整数。 我已经搜索了很多,并试图用java转换它,但不能这样做。我需要一个方法,说明,库或任何可以帮助我实现它

一班 {

SortedNode类别为:

 public class SortedCostNodeList
{
    ArrayList _list;
    NodeComparer _nodeComparer;
 public SortedCostNodeList()
    {
        _list = new ArrayList ();
        _nodeComparer = new NodeComparer ();
    }
  public int push (Node n)
    {

        int k = _list.BinarySearch (n,_nodeComparer);

        if (k==-1) // no element
            _list.Insert (0,n);
        else if (k<0) // find location by complement
        {
            k=~k;
            _list.Insert (k,n);
        }
        else if (k>=0)
            _list.Insert (k,n);

        return k;
    }
我无法实现这段代码 //int k=_list.BinarySearch n,_nodeComparer

有什么帮助吗?

您可以使用它对对象数组执行二进制搜索

我已经创建了一个示例程序。希望对您有所帮助

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

@Getter @Setter
@AllArgsConstructor
class Node {
    private long totalCost;
}

public class StackOverFlow {
    public static void main(String... args) {
        final List<Node> list = new ArrayList<>();
        list.add(new Node(10));
        list.add(new Node(20));
        list.add(new Node(30));
        list.add(new Node(40));
        list.add(new Node(50));
        list.add(new Node(60));
        list.add(new Node(70));

        final Node searchKey = new Node(60);
        int index = Arrays.binarySearch(list.toArray(new Node[list.size()]), searchKey, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return (int) (o1.getTotalCost() - o2.getTotalCost());
            }
        });

        System.out.print("Found at " + index);
    }
}
更新: 试试这个


BinarySearch方法正是它所建议的:使用二进制搜索算法来定位指定的对象。如果性能不是一个很大的问题,您可以很容易地,或者您可以始终使用常规的迭代搜索。请记住,二进制搜索只对已排序的集合有效。顺便说一句,我不知道您是否想到过使用这些C方法,但您不应该再在C中使用ArrayList。它在很久以前就被淘汰了,取而代之的是泛型列表,它在应用程序之外专门用于处理遗留系统,在各个方面都是可取的。不过,为了澄清这一点,我谈论的是C。Java ArrayList与C列表非常相似,而且我所记得的仍然可以很好地使用。仍然没有进展。我像这样使用它,但它说的是非法的第三个参数。int k=Arrays.binarySearchlist.toArraynew Node[list.size],start,new Comparator{@Override public int compareNode o1,Node o2{return int o1.gettotalCost-o2.gettotalCost;};非常感谢!非常有用
  public class NodeComparer:IComparer
{
    public NodeComparer()
    {

    }

    public int Compare(object x, object y)
    {
        return ((Node)x).totalCost -  ((Node) y).totalCost ;
    }
}
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

@Getter @Setter
@AllArgsConstructor
class Node {
    private long totalCost;
}

public class StackOverFlow {
    public static void main(String... args) {
        final List<Node> list = new ArrayList<>();
        list.add(new Node(10));
        list.add(new Node(20));
        list.add(new Node(30));
        list.add(new Node(40));
        list.add(new Node(50));
        list.add(new Node(60));
        list.add(new Node(70));

        final Node searchKey = new Node(60);
        int index = Arrays.binarySearch(list.toArray(new Node[list.size()]), searchKey, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return (int) (o1.getTotalCost() - o2.getTotalCost());
            }
        });

        System.out.print("Found at " + index);
    }
}
class NodeComparator implements Comparator<Node> {
    @Override
    public int compare(Node o1, Node o2) {
        return (int) (o1.getTotalCost() - o2.getTotalCost());
    }
}

class SortedCostNodeList {
    ArrayList<Node> list;
    NodeComparator nodeCompartor;

    public SortedCostNodeList() {
        this.list = new ArrayList<>();
        this.nodeCompartor = new NodeComparator();
    }

    public int push(Node n) {

        int k = Arrays.binarySearch(this.list.toArray(new Node[list.size()]), n, this.nodeCompartor);

        if (k == -1) // no element
            this.list.add(0, n);
        else if (k < 0) // find location by complement
        {
            k = ~k;
            this.list.add(k, n);
        } else if (k >= 0)
            this.list.add(k, n);

        return k;
    }
    // ...
}