我在使用 Java 内置的 Collections.sort() 方法时遇到问题。我正在尝试对名为 TreeNode 的自定义对象类型的 ArrayList 进行排序。我过去曾成功地使用过该方法,并且希望从外部查看我是否遗漏了任何明显的东西。
我想对这些 TreeNode 对象进行排序的方式是通过一个整数字段,它们都称为 myWeight,一个整数表示特定字符在文本文件中出现的次数。在我的项目中,我使用了一个名为 TreeNode 的自定义类和该类的两个子类,名为 InternalNode 和 LeafNode。这些节点用于构建用于对文本文件进行编码的哈夫曼树。我已经确保所有这些都实现了 Comparable 并且我已经尝试了只有具有 compareTo() 方法的父 TreeNode 类的变体,让它们都具有相同的 compareTo() 方法,我已经放弃了我的 compareTo()实现改为在其中使用 Integer.compare() 方法,但没有骰子。
我也尝试过使用比较器并将其作为 Collections.sort() 方法的参数传递,但也没有任何改变。
这是我尝试调用排序并显示结果的地方:
private void generateHuffmanTreeTest(final HashMap<Character, Integer> theMap) {
ArrayList<TreeNode> sortedList = new ArrayList<TreeNode>();
System.out.println("Generating the Huffman Tree with new logic...");
for (Map.Entry<Character, Integer> entry : theMap.entrySet()) {
sortedList.add(new LeafNode(entry.getKey(), entry.getValue()));
}
Collections.sort(sortedList);
for (int i = 0; i < sortedList.size(); i++) {
LeafNode n = (LeafNode) sortedList.get(i);
System.out.println(n.myData + " " + n.myWeight);
}
下面是我也尝试比较的对象类。
public class TreeNode implements Comparable<TreeNode> {
/** Left child of this node. */
public TreeNode myLeft;
/** Right child of this node. */
public TreeNode myRight;
/**
* Weight of all nodes branching from this one, or the weight
* of just this node if this node is a leaf.
*/
public int myWeight;
/**
* Default constructor. Should not be used to create pure
* TreeNode objects.
* No TreeNodes should be constructed, only InternalNodes
* and LeafNodes should comprise the tree.
*/
public TreeNode() {
}
/**
* Sets the left child of this node.
*
* @param theNode The node to become the left child.
*/
public void setLeft(final TreeNode theNode) {
myLeft = theNode;
}
/**
* Sets the right child of this node.
*
* @param theNode The node to become the right child.
*/
public void setRight(final TreeNode theNode) {
myRight = theNode;
}
/**
* Compares two TreeNodes based on their myWeight field.
*/
@Override
public int compareTo(TreeNode theOther) {
int result = 0;
if (myWeight < theOther.myWeight) result = -1;
if (myWeight > theOther.myWeight) result = 1;
return result;
}
}
public class InternalNode extends TreeNode implements Comparable<TreeNode> {
/**
* Creates a new InternalNode.
*/
public InternalNode() {
super();
}
/**
* Calculates the weight of both children from this Node.
*/
public void calcWeight() {
int result = 0;
if (myLeft != null) result = result + myLeft.myWeight;
if (myRight != null) result = result + myRight.myWeight;
myWeight = result;
}
/**
* Sets the left child of this node.
*
* @param theNode The child to be set.
*/
public void setLeft(final TreeNode theNode) {
myLeft = theNode;
}
/**
* Sets the right child of this node.
*
* @param theNode The child to be set.
*/
public void setRight(final TreeNode theNode) {
myRight = theNode;
}
/**
* Compares two TreeNodes based on their myWeight field.
*/
@Override
public int compareTo(TreeNode theOther) {
int result = 0;
if (myWeight < theOther.myWeight) result = -1;
if (myWeight > theOther.myWeight) result = 1;
return result;
}
}
public class LeafNode extends TreeNode implements Comparable<TreeNode> {
/** Char value for this node to hold. */
public char myData;
/** Weight value of the char this node holds. */
public int myWeight;
/**
* Creates a new LeafNode that contains a char value for it to
* hold as well as a weight value that is equal to the number
* of times that character appears in the target String.
*
* @param theData The char value for this node to hold.
* @param theWeight The frequency of the char value in the text.
*/
public LeafNode(final char theData, final int theWeight) {
super();
myData = theData;
myWeight = theWeight;
}
/**
* Compares two TreeNodes based on their myWeight field.
*/
@Override
public int compareTo(TreeNode theOther) {
int result = 0;
if (myWeight < theOther.myWeight) result = -1;
if (myWeight > theOther.myWeight) result = 1;
return result;
}
}
编辑*** 是的,如果我也发布这个东西的输出可能会有帮助。 这是我从已阅读的文本文件运行此代码时得到的结果:
65007
514908
! 3923
" 17970
# 1
$ 2
% 1
' 7529
( 670
) 670
* 300
, 39891
- 6308
. 30806
/ 29
0 179
1 392
2 147
3 61
4 23
5 55
6 57
7 40
8 193
9 35
: 1014
; 1145
= 2
? 3137
@ 2
A 6574
B 3606
C 2105
D 2017
E 2259
F 1946
G 1303
H 4378
I 7931
J 308
K 1201
L 713
M 3251
N 3614
O 1635
P 6519
Q 35
R 3057
S 2986
T 6817
U 254
V 1116
W 2888
X 673
Y 1265
Z 108
[ 1
] 1
à 4
a 199232
b 31052
c 59518
d 116273
ä 1
e 312974
f 52950
g 50023
h 163026
i 166350
é 1
j 2266
ê 11
k 19230
l 95814
m 58395
n 180559
o 191244
p 39014
q 2295
r 145371
s 159905
t 219589
u 65180
v 25970
w 56319
x 3711
y 45000
z 2280
1
最佳答案
您遇到的问题是您在 TreeNode
和 LeafNode
中都定义了 myWeight
。因此,compareTo
方法使用的 myWeight
变量可能与 LeafNode
构造函数和写入的变量不同当你打印 LeafNode.myWeight
时输出。
您可能只想从 LeafNode
中删除 myWeight
的重复定义。
请参阅此处关于变量隐藏的部分:https://dzone.com/articles/variable-shadowing-and-hiding-in-java
关于Java Collections.sort() 不排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50122113/