Праблема атрымання унікальных элементаў спісу

Я спрабую атрымаць унікальныя элементы з спісу класаў з фарматам:

[EntityClientPlayerMP['Player989'/228, l='MpServer', x=138.16, y=68.62, z=522.96], EntityCow['Cow'/231, l='MpServer', x=143.63, y=68.00, z=527.50]....]

гэтыя спісы, як правіла, маюць памер 60-100.

Метад, які я спрабую выкарыстоўваць у дадзены момант

List uniqueList = new ArrayList(new HashSet(fullList));

гэта вяртае той жа спіс, але адсартаваны крыху па-іншаму. Любыя ідэі аб тым, чаму?

3
Што робіць ваш клас клас выглядаць? (Я мяркую, што вы не азначае java.lang.Class ?)
дададзена аўтар ruakh, крыніца
Што робіць ваш клас клас выглядаць? (Я мяркую, што вы не азначае java.lang.Class ?)
дададзена аўтар ruakh, крыніца
Гэта гучыць вельмі падобна на "<�я> я не рэалізаваць хэш-код() і Equals() " пытанне.
дададзена аўтар jahroy, крыніца
Гэта гучыць вельмі падобна на "<�я> я не рэалізаваць хэш-код() і Equals() " пытанне.
дададзена аўтар jahroy, крыніца
Што вы маеце на ўвазе пад «адсартаваны крыху па-іншаму»? Ці можаце вы прывесці прыклад?
дададзена аўтар chessbot, крыніца
Што вы маеце на ўвазе пад «адсартаваны крыху па-іншаму»? Ці можаце вы прывесці прыклад?
дададзена аўтар chessbot, крыніца
Сартаванне не з'яўляецца праблемай для мяне, я быў зьбянтэжаны, чаму яна вяртае адсартаваны версію, але не толькі унікальныя элементы, як гэта зрабілі аперацыю ў спісе для сартавання, але не выдаліць дублікаты. Іншыя каментары паказалі, што я не ведаю дастаткова аб рэалізацыі hashcodes, таму я шукаю ў тым, што ў дадзены момант я патлумачыў маё выкарыстанне класа ў каментарах ніжэй.
дададзена аўтар Rampartisan, крыніца

7 адказы

Яны упарадкаваны па-рознаму, таму што HashSet мае «дзіўнае» ўпарадкаванне, на аснове хэш-код з аб'ектаў. Для таго, каб захаваць парадак, выкарыстоўвайце LinkedHashSet .

Што тычыцца адзінасці, то набор будзе выкарыстоўваць роўны() і хэш-код() , так што тыя, якія рэалізаваны правільна. Лянівы метад, які часам працуе, каб выкарыстоўваць ToString() метад вашых аб'ектаў (і выклікаць хэш-код і раўняецца на струнных).

3
дададзена

Яны упарадкаваны па-рознаму, таму што HashSet мае «дзіўнае» ўпарадкаванне, на аснове хэш-код з аб'ектаў. Для таго, каб захаваць парадак, выкарыстоўвайце LinkedHashSet .

Што тычыцца адзінасці, то набор будзе выкарыстоўваць роўны() і хэш-код() , так што тыя, якія рэалізаваны правільна. Лянівы метад, які часам працуе, каб выкарыстоўваць ToString() метад вашых аб'ектаў (і выклікаць хэш-код і раўняецца на струнных).

3
дададзена

You need to provide correct implementation for equals() and hashcode()

2
дададзена

You need to provide correct implementation for equals() and hashcode()

2
дададзена

You need to provide correct implementation for equals() and hashcode()

2
дададзена

Не забудзьцеся перавызначыць роўны() і хэш-код() метады ў кожным з класаў сутнасцяў ( чаму? ), у адваротным выпадку набор будзе не ў стане правільна вызначыць, калі два элемента роўныя. Акрамя таго, я думаю, што вы мелі на ўвазе наступнае:

List uniqueList =
    new ArrayList(
        new LinkedHashSet(fullList));

Цяпер у прыведзеным вышэй фрагменце кода параметр тыпу з'яўляецца адзін, у прыватнасці, (а не Клас , як паказана ў гэтым пытанні, які замяняе з фактычным тыпам па меры неабходнасці), а таксама з дапамогай LinkedHashSet мы гарантуем, што ўпарадкаванасць ў першапачатковым спісе захаваліся.

2
дададзена
@Arend У гэтым выпадку вы хочаце аб'ект.
дададзена аўтар user949300, крыніца
Зменіце пытанне і дадаць дэталі. І няма, гэта не здаецца добрай ідэяй, каб атрымаць спіс класаў. Усе асобнікі падзяляюць адзін і той жа клас!
дададзена аўтар Óscar López, крыніца
Цалкам магчыма, што OP выкарыстоўваецца Клас У якасці прыкладу, запаўняльнік для рэальных класаў, так што давайце ігнараваць, што і засяродзіцца на пытанні
дададзена аўтар Óscar López, крыніца
Прыклад спісу ўключае не толькі EntityClientPlayerMP , але і EntityCow . Меркавана гэтыя падтыпы ФП ў класа <�код /> тыпу.
дададзена аўтар Arend, крыніца
Я меў на ўвазе, па-відаць, OP вызначыў свой уласны тып Клас з якіх EntityClientPlayerMP і EntityCow падтыпы. Вядома, гэта толькі пустыя домыслы, і наўрад ці стаўленне да пытання (да вашага адказу на які я не маю нічога дадаць).
дададзена аўтар Arend, крыніца
Я Infact адсылаючы да класа, так як гэты спіс выкарыстоўваецца ў модах для гульні Minecraft шукаць вораг іх класам, убудаваны метад у кодзе запытвае клас у якасці аргументу. Я не ўпэўнены, калі гэта правільна ці не, будучы даволі новы кадавальнік, але гэта працуе так, як я чакаў. Карыстаецца Клас не добрая ідэя? Я спрабую апублікаваць метад у гэтым каментары, але там не хапае месца, Што лепшы спосаб паказаць гэта?
дададзена аўтар Rampartisan, крыніца

Не забудзьцеся перавызначыць роўны() і хэш-код() метады ў кожным з класаў сутнасцяў ( чаму? ), у адваротным выпадку набор будзе не ў стане правільна вызначыць, калі два элемента роўныя. Акрамя таго, я думаю, што вы мелі на ўвазе наступнае:

List uniqueList =
    new ArrayList(
        new LinkedHashSet(fullList));

Цяпер у прыведзеным вышэй фрагменце кода параметр тыпу з'яўляецца адзін, у прыватнасці, (а не Клас , як паказана ў гэтым пытанні, які замяняе з фактычным тыпам па меры неабходнасці), а таксама з дапамогай LinkedHashSet мы гарантуем, што ўпарадкаванасць ў першапачатковым спісе захаваліся.

2
дададзена
@Arend У гэтым выпадку вы хочаце аб'ект.
дададзена аўтар user949300, крыніца
Зменіце пытанне і дадаць дэталі. І няма, гэта не здаецца добрай ідэяй, каб атрымаць спіс класаў. Усе асобнікі падзяляюць адзін і той жа клас!
дададзена аўтар Óscar López, крыніца
Цалкам магчыма, што OP выкарыстоўваецца Клас У якасці прыкладу, запаўняльнік для рэальных класаў, так што давайце ігнараваць, што і засяродзіцца на пытанні
дададзена аўтар Óscar López, крыніца
Прыклад спісу ўключае не толькі EntityClientPlayerMP , але і EntityCow . Меркавана гэтыя падтыпы ФП ў класа <�код /> тыпу.
дададзена аўтар Arend, крыніца
Я меў на ўвазе, па-відаць, OP вызначыў свой уласны тып Клас з якіх EntityClientPlayerMP і EntityCow падтыпы. Вядома, гэта толькі пустыя домыслы, і наўрад ці стаўленне да пытання (да вашага адказу на які я не маю нічога дадаць).
дададзена аўтар Arend, крыніца
Я Infact адсылаючы да класа, так як гэты спіс выкарыстоўваецца ў модах для гульні Minecraft шукаць вораг іх класам, убудаваны метад у кодзе запытвае клас у якасці аргументу. Я не ўпэўнены, калі гэта правільна ці не, будучы даволі новы кадавальнік, але гэта працуе так, як я чакаў. Карыстаецца Клас не добрая ідэя? Я спрабую апублікаваць метад у гэтым каментары, але там не хапае месца, Што лепшы спосаб паказаць гэта?
дададзена аўтар Rampartisan, крыніца