我一直在学习的OCJP(原SCJP)和我碰到下面的例子,它使用LinkedHashSet传来:
public class Test{
int size;
public Test(int s){
this.size = s;
}
@Override
public boolean equals(Object obj) {
return (this.size == ((Test)obj).size);
}
public static void main(String[] args) {
LinkedHashSet<Test> s = new LinkedHashSet<Test>();
s.add(new Test(1));
s.add(new Test(2));
s.add(new Test(1));
System.out.println(s.size());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,是什么是显示的问题,如果:
1)实现保持如
2)的hashCode覆盖插入类测试,如下所示:
public int hashCode() {return size/5};
Run Code Online (Sandbox Code Playgroud)
运行和编译代码表明第一种情况下set的大小是3,而在第二种情况下它是2.为什么?
在情况1中,虽然equals方法被覆盖,但它永远不会被调用.这是否意味着如果不覆盖hashCode方法,add()方法不会检查对象是否相等?
在情况2中,具有给定实现的hashCode和给定的Test对象集始终返回相同的数字.这与默认的hashCode实现有什么不同,为什么它会导致equals被调用?
使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
Run Code Online (Sandbox Code Playgroud)
LinkedHashSet 有没有一种简单的方法可以实现这一点?
假设参数是有序集合,构造函数是否LinkedHashSet(Collection<? extends E> c)保证其参数的保留顺序?我们如何确定这一点?
Javadoc 文档没有提及顺序:
构造一个新的链接哈希集,其元素与指定集合相同。创建链接哈希集时具有足以容纳指定集合中的元素的初始容量和默认加载因子 (0.75)。
我不认为它有任何理由不保留顺序,但我想知道它是否得到保证(对于当前和未来的实现)。
我有一个方法遍历一个板中的可能状态并将它们存储在HashMap中
void up(String str){
int a = str.indexOf("0");
if(a>2){
String s = str.substring(0,a-3)+"0"+str.substring(a-2,a)+str.charAt(a-3)+str.substring(a+1);
add(s,map.get(str)+1);
if(s.equals("123456780")) {
System.out.println("The solution is on the level "+map.get(s)+" of the tree");
//If I get here, I need to know the keys on the map
// How can I store them and Iterate through them using
// map.keySet()?
}
}
Run Code Online (Sandbox Code Playgroud)
}
我对这组钥匙很感兴趣.我应该怎么做才能打印出来?
HashSet t = map.keySet() 被编译器拒绝了
LinkedHashSet t = map.keySet()
Run Code Online (Sandbox Code Playgroud) 我有一个链接哈希集,我需要从中获取元素的插入顺序。要检索,我无法按照准确的插入顺序获取元素。
将linkedHashset转换为List以通过索引获取,但恐怕转换为list会改变我的元素改变顺序
LinkedHashSet<String> personDetails = new LinkedHashSet<String>();
//persondetails => John, kennedy, Female
List<String> details = new ArrayList<>(personDetails);
String firstName = details.get(0);
String lastName = details.get(1);
String gender = details.get(2);
Run Code Online (Sandbox Code Playgroud)
转换为列表是抛弃我首先按插入顺序检索它们的主要目标,因为列表不保留顺序。
你能在这里给我建议一个替代方案或我的错误吗?
在java中我们有:
private Set<AutoComplete> hashList = new LinkedHashSet<>();
Run Code Online (Sandbox Code Playgroud)
和:
public class AutoComplete {
private String name;
private String id;
//...geters and setters
@Override
public boolean equals(Object o) {
if (o instanceof AutoComplete) {
AutoComplete autoComplete = (AutoComplete) o;
if (name.equals(autoComplete.name) && id.equals(autoComplete.id))
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 17;
int hashMultiplikator = 79;
try {
hash = hashMultiplikator * hash
+ getId().hashCode();
} catch (java.lang.Exception e) {
e.printStackTrace();
MLogger.logException("autocomplete id can't be null", …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Junit测试,该测试应测试两个LinkedHashSets中元素的顺序是否相同.以下是我现有的代码:
Assert.assertEquals(
Sets.newLinkedHashSet(Arrays.asList("a","d","c","b")),
conf.getSetInfo()
);
Run Code Online (Sandbox Code Playgroud)
即使我给它比较a,d,c,b与a,b,c,d并且因此不考虑元素的排序,这个测试也是成功的.我怎样才能根据订单进行断言?
好的,我有一个JTable,我从LinkedHashSet of Books填充.
public static void LibToArray(){
rowData = new Object[Book.bookList.size()][5];
int i = 0;
Iterator it = Book.bookList.iterator();
while(it.hasNext()){
Book book1 = (Book)it.next();
rowData[i][0] = (Integer)book1.getId();
rowData[i][1] = book1.getTitle();
rowData[i][2] = book1.getAuthor();
rowData[i][3] = (Boolean)book1.getIsRead();
rowData[i][4] = book1.getDateStamp();
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题我是否希望第4个coloum将布尔状态显示为复选框,并且我希望能够在将状态保存回LinkedHashSet并刷新表后进行更改.
对不起我是初学者,如果你能给我一些建议,我们将不胜感激.
我有两组LinkedHashSet对象,在这个对象中我有其他对象有更多LinkedHashSet.
我的问题是:
该equals方法(默认)是否检查所有内部HashSets是否相同?或者我必须覆盖它?
我有一个包含多个值的LinkedHashSet.
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
Run Code Online (Sandbox Code Playgroud)
我想迭代这组值并显示存储在集合中的项目数的前五个值.我使用for循环迭代值并显示数据,见下文:
for (String sent : lhs) {
text.append(sent);
}
Run Code Online (Sandbox Code Playgroud)
这将输出存储在LinkedHashSet中的所有值.我应该对我的代码进行哪些更改,以便仅从集合中获取前5个值.