将C方法转换为Java(Android Studio)
这是我试图转换的C代码将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;
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;
}
// ...
}