java-根据指定的整数值对字符串的链表进行排序
我有一个字符串的链表,每个字符串都有一个计算所得的整数值。为了便于解释,我有一个表示节点的字符串链表。每个节点都有一个距离。要获得距离,可以使用我在程序中创建的方法返回该节点的距离。我希望链表按字符串的每个距离排序,从最低到最高。我该怎么做?这是一个密码java-根据指定的整数值对字符串的链表进行排序,java,linked-list,Java,Linked List,我有一个字符串的链表,每个字符串都有一个计算所得的整数值。为了便于解释,我有一个表示节点的字符串链表。每个节点都有一个距离。要获得距离,可以使用我在程序中创建的方法返回该节点的距离。我希望链表按字符串的每个距离排序,从最低到最高。我该怎么做?这是一个密码 Queue<String> someStringList = new LinkedList<String>(); Queue someStringList=new LinkedList(); 列表中每个节点的 字符
Queue<String> someStringList = new LinkedList<String>();
Queue someStringList=new LinkedList();
列表中每个节点的
字符串节点=((LinkedList)someStringList.get(i);
距离=节点距离(节点);
按节点的距离对链表排序
...
公共整数距离(字符串str){
返回距离;
}第一个选项是创建一个比较器,然后对集合进行排序。我会这样做:
public static void main(String... arg) {
LinkedList<String> someStringList = new LinkedList<>();
someStringList.add("2");
someStringList.add("1");
System.out.println(someStringList);
Collections.sort(someStringList, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return theNodesDistance(s1).compareTo(theNodesDistance(s2));
}
});
System.out.println(someStringList);
}
public static Integer theNodesDistance(String str){
return Integer.parseInt(str); // here return the distance
}
如果您可以在重复计算距离时浪费CPU,那么您可以使用JDK排序方法和比较器实现来计算任意2个字符串的距离并进行比较。这是最简单的 如果希望只计算一次每个字符串的距离(假定这是昂贵的),则可以: a) 构造一个新的元组集合(字符串和距离),并按距离对元组进行排序(再次使用比较器,或者通过使元组类具有可比性)
b) 或者,您可以尝试将距离缓存在字符串的哈希映射中,以达到比较器所依赖的距离。您可以使用TreeMap。。以下是一个正常的演示-
TreeMap<Integer, String> tmap = new TreeMap<Integer, String>();
/*Adding elements to TreeMap*/
tmap.put(1, "Data1");
tmap.put(23, "Data2");
tmap.put(70, "Data3");
tmap.put(4, "Data4");
tmap.put(2, "Data5");
/* Display content using Iterator*/
Set set = tmap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
System.out.println(mentry.getValue());
}
您可以使用排序算法。像selectionsort,bubblesort。。。 这是insertionsort
double temp;
for(int i = 1;i<yourList.size();i++)
{
temp = thenodedistance(yourlist.get(i));
int j = i;
while(j>0&&thenodedistance(yourlist.get(j-1))> temp)
{
yourlist.add(j,yourlist.remove(j-1);
j--;
}
yourlist.add(j,yourliste.remove(i));
}
双温;
对于(inti=1;i0&&thenodedistance(yourlist.get(j-1))>temp)
{
yourlist.add(j,yourlist.remove)(j-1);
j--;
}
添加(j,yourliste.remove(i));
}
通过这种方式,您可以对列表进行排序(没有尝试代码…)使用节点类怎么样
class Node{
String str;
int distance;
public Node(String str){
this.str = str;
this.distance = theNodesDistance(str);
}
}
然后您可以重写一个比较器。我建议您使用PriorityQueue而不是LinkedList,这样您对有序列表的插入可以更有效(O(logn))。在这种情况下,您实际上不需要调用排序或heapify函数,因为优先级队列始终保持节点的有序
Queue<Node> nodes = new PriorityQueue<>();
nodes.add(new Node("10"));
nodes.add(new Node("3"));
nodes.add(new Node("2"));
nodes.add(new Node("1"));
nodes.add(new Node("4"));
System.out.println(nodes.remove());
System.out.println(nodes.remove());
System.out.println(nodes.remove());
System.out.println(nodes.remove());
System.out.println(nodes.remove());
PriorityQueue que = new PriorityQueue(new Comparator<Node>(){
public int compare(Node n1, Node n2){
if(n1.distance < n2. distance) return -1;
else if(n1.distance > n2.distance) return 1;
return 0;
}
});
您需要一个节点类来表示封装了距离的节点&实现基于距离的可比比较节点您可以简单地执行类似于
Comparator.comparingit(Someclass::theNodesDistance)的操作
,无需实现比较器
。对于第二组代码,我是否将其添加到节点类或其他类?我认为最好添加到另一个类。是否有理由不使用集合。排序
?
TreeMap<Integer, String> tmap = new TreeMap<Integer, String>();
/*Adding elements to TreeMap*/
tmap.put(1, "Data1");
tmap.put(23, "Data2");
tmap.put(70, "Data3");
tmap.put(4, "Data4");
tmap.put(2, "Data5");
/* Display content using Iterator*/
Set set = tmap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
System.out.println(mentry.getValue());
}
key is: 1 & Value is: Data1
key is: 2 & Value is: Data5
key is: 4 & Value is: Data4
key is: 23 & Value is: Data2
key is: 70 & Value is: Data3
double temp;
for(int i = 1;i<yourList.size();i++)
{
temp = thenodedistance(yourlist.get(i));
int j = i;
while(j>0&&thenodedistance(yourlist.get(j-1))> temp)
{
yourlist.add(j,yourlist.remove(j-1);
j--;
}
yourlist.add(j,yourliste.remove(i));
}
class Node{
String str;
int distance;
public Node(String str){
this.str = str;
this.distance = theNodesDistance(str);
}
}
PriorityQueue que = new PriorityQueue(new Comparator<Node>(){
public int compare(Node n1, Node n2){
if(n1.distance < n2. distance) return -1;
else if(n1.distance > n2.distance) return 1;
return 0;
}
});
for(each str){
que.add(new Node(str));
}