Commit 39b7dbec authored by fallenstardust's avatar fallenstardust

搜索结果卡片排序

parent aa3f3f4d
......@@ -255,10 +255,6 @@ public class DeckInfo {
}
}
private boolean comp(Card c1, Card c2) {
return CardSort.ASC.compare(c1, c2) < 0;
}
public void sortAll() {
sortMain();
sortExtra();
......@@ -281,9 +277,9 @@ public class DeckInfo {
int len = cards.size();
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
Card d1 = cards.get(j);
Card d2 = cards.get(j + 1);
if (comp(d1, d2)) {
Card c1 = cards.get(j);
Card c2 = cards.get(j + 1);
if (CardSort.FULL_ASC.compare(c1, c2) > 0) {
Collections.swap(cards, j, j + 1);
}
}
......
......@@ -17,20 +17,20 @@ import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.utils.CardSort;
import ocgcore.CardManager;
import ocgcore.DataManager;
import ocgcore.LimitManager;
import ocgcore.StringManager;
import ocgcore.data.Card;
import ocgcore.data.LimitList;
import ocgcore.enums.CardType;
import ocgcore.enums.LimitType;
public class CardLoader implements ICardLoader {
private LimitManager mLimitManager;
private CardManager mCardManager;
private StringManager mStringManager;
private Context context;
public class CardLoader implements ICardSearcher {
private final LimitManager mLimitManager;
private final CardManager mCardManager;
private final StringManager mStringManager;
private final Context context;
private CallBack mCallBack;
private LimitList mLimitList;
private static final String TAG = CardLoader.class.getSimpleName();
......@@ -62,11 +62,8 @@ public class CardLoader implements ICardLoader {
}
}
@Override
public SparseArray<Card> readCards(List<Integer> ids, boolean isSorted) {
return readCards(ids, mLimitList, isSorted);
}
public SparseArray<Card> readCards(List<Integer> ids, LimitList limitList, boolean isSorted) {
if (!isOpen()) {
return null;
}
......@@ -84,6 +81,7 @@ public class CardLoader implements ICardLoader {
return map;
}
@Override
public boolean isOpen() {
return mCardManager.getCount() > 0;
}
......@@ -127,34 +125,16 @@ public class CardLoader implements ICardLoader {
}
Dialog wait = DialogPlus.show(context, null, context.getString(R.string.searching));
VUiKit.defer().when(() -> {
List<Card> tmp = new ArrayList<Card>();
List<Card> monster = new ArrayList<Card>();
List<Card> spell = new ArrayList<Card>();
List<Card> trap = new ArrayList<Card>();
SparseArray<Card> cards = mCardManager.getAllCards();
int count = cards.size();
for (int i = 0; i < count; i++) {
List<Card> list = new ArrayList<>();
for (int i = 0; i < cards.size(); i++) {
Card card = cards.valueAt(i);
if (searchInfo == null || searchInfo.check(card)) {
if (searchInfo != null && card.Name.equalsIgnoreCase(searchInfo.keyWord1)) {
tmp.add(card);
} else if (card.isType(CardType.Monster)) {
monster.add(card);
} else if (card.isType(CardType.Spell)) {
spell.add(card);
} else if (card.isType(CardType.Trap)) {
trap.add(card);
}
}
}
Collections.sort(tmp, ASCode);
Collections.sort(monster, ASC);
Collections.sort(spell, ASCode);
Collections.sort(trap, ASCode);
tmp.addAll(monster);
tmp.addAll(spell);
tmp.addAll(trap);
return tmp;
list.add(card);
}
}
Collections.sort(list, CardSort.ASC);
return list;
}).fail((e) -> {
if (mCallBack != null) {
ArrayList<Card> noting = new ArrayList<Card>();
......@@ -170,18 +150,15 @@ public class CardLoader implements ICardLoader {
});
}
private Comparator<Card> ASCode = new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
int index1 = (Integer.valueOf(o1.Code).intValue());
int index2 = (Integer.valueOf(o2.Code).intValue());
return index1 - index2;
public List<Card> sort(List<Card> cards){
Collections.sort(cards, CardSort.ASC);
return cards;
}
};
private Comparator<Card> ASC = new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
private static final Comparator<Card> ASCode = (o1, o2) -> o1.Code - o2.Code;
private static final Comparator<Card> ASC = (o1, o2) -> {
if (o1.getStar() == o2.getStar()) {
if (o1.Attack == o2.Attack) {
return (int) (o2.Code - o1.Code);
......@@ -191,7 +168,6 @@ public class CardLoader implements ICardLoader {
} else {
return o2.getStar() - o1.getStar();
}
}
};
@Override
......
package cn.garymb.ygomobile.loader;
import android.util.SparseArray;
import java.util.List;
import ocgcore.data.Card;
import ocgcore.data.LimitList;
public interface ICardLoader{
void search(String prefixWord, String suffixWord,
long attribute, long level, long race,String limitName,long limit,
String atk, String def,long pscale,
long setcode, long category, long ot,int link, long... types);
void onReset();
void setLimitList(LimitList limit);
LimitList getLimitList();
public interface ICardLoader {
List<Card> sort(List<Card> cards);
boolean isOpen();
SparseArray<Card> readCards(List<Integer> ids, boolean isSorted);
}
......@@ -7,15 +7,50 @@ import ocgcore.enums.CardType;
public class CardSort implements Comparator<Card> {
public static final CardSort ASC = new CardSort();
public CardSort() {
public static final CardSort ASC = new CardSort(false);
public static final CardSort FULL_ASC = new CardSort(true);
private final boolean full;
private CardSort(boolean full) {
this.full = full;
}
private int comp(long l1, long l2) {
if (l1 == l2) return 0;
if (l1 > l2) return 1;
return -1;
return Long.compare(l1, l2);
}
private static final int SORT_OTHER = 999;
private static final int SORT_MONSTER = 1;
private static final int SORT_LINK = 2;
private static final int SORT_SPELL = 3;
private static final int SORT_TRAP = 4;
private static final int SORT_FUSION = 10;
private static final int SORT_SYNCHRO = 11;
private static final int SORT_XYZ = 12;
private int getSortKey1(Card c1){
if (c1.isType(CardType.Link)) {
return SORT_LINK;
} else if (c1.isType(CardType.Monster)) {
return SORT_MONSTER;
} else if (c1.isType(CardType.Spell)) {
return SORT_SPELL;
} else if (c1.isType(CardType.Trap)) {
return SORT_TRAP;
} else{
return SORT_OTHER;
}
}
private int getSortKey2(Card c1){
if (c1.isType(CardType.Fusion)) {
return SORT_FUSION;
} else if (c1.isType(CardType.Synchro)) {
return SORT_SYNCHRO;
} else if (c1.isType(CardType.Xyz)) {
return SORT_XYZ;
} else{
return SORT_OTHER;
}
}
@Override
......@@ -26,89 +61,56 @@ public class CardSort implements Comparator<Card> {
if (c2 == null) {
return 1;
}
// boolean log = c1.Code == 74003290||c2.Code == 74003290;
if (c1.isType(CardType.Spell)) {
if (c2.isType(CardType.Monster)) {
//怪兽在前面
return -1;
//同名卡
if(c1.isAlias(c2)){
return comp(c1.Code, c2.Code);
}
if (c2.isType(CardType.Trap)) {
//陷阱在前面
return 1;
int sortKey1 = getSortKey1(c1);
int sortKey2 = getSortKey1(c2);
if(sortKey1 != sortKey2){
return Integer.compare(sortKey1, sortKey2);
}
long type1 = c1.Type ^ CardType.Spell.value();
long type2 = c2.Type ^ CardType.Spell.value();
int rs = comp(type1, type2);
if (rs == 0) {
return comp(c1.Code, c2.Code);
if(sortKey1 == SORT_SPELL || sortKey2 == SORT_TRAP){
long type1, type2;
if(sortKey1 == SORT_SPELL){
type1 = c1.Type ^ CardType.Spell.getId();
type2 = c2.Type ^ CardType.Spell.getId();
} else {
return rs;
type1 = c1.Type ^ CardType.Trap.getId();
type2 = c2.Type ^ CardType.Trap.getId();
}
} else if (c1.isType(CardType.Trap)) {
//怪兽魔法在前面
if (c2.isType(CardType.Monster) || c2.isType(CardType.Spell)) {
return -1;
}
long type1 = c1.Type ^ CardType.Trap.value();
long type2 = c2.Type ^ CardType.Trap.value();
int rs = comp(type1, type2);
if (rs == 0) {
return comp(c1.Code, c2.Code);
} else {
return rs;
}
} else if (c1.isType(CardType.Monster)) {
//魔法陷阱在后面
if (c2.isType(CardType.Spell)) {
//怪兽在前面
return 1;
}
if (c2.isType(CardType.Trap)) {
//陷阱在前面
return 2;
}
//超量,同调,融合
//1,2,3
if (c1.isType(CardType.Xyz)) {
if (c2.isType(CardType.Synchro)) {
return -1;
}
if (c2.isType(CardType.Fusion)) {
return -2;
}if (c2.isType(CardType.Link)) {
return 1;
}
} else if (c1.isType(CardType.Synchro)) {
if (c2.isType(CardType.Xyz)) {
return 1;
}
if (c2.isType(CardType.Fusion)) {
return -1;
}
if (c2.isType(CardType.Link)) {
return 2;
}
} else if (c1.isType(CardType.Fusion)) {
if (c2.isType(CardType.Xyz)) {
return 2;
}
if (c2.isType(CardType.Synchro)) {
return 1;
}
if (c2.isType(CardType.Link)) {
return 3;
} else if(sortKey1 == SORT_OTHER){
return comp(c1.Code, c2.Code);
// } else if(sortKey1 == SORT_LINK){
// return Integer.compare(c2.getStar(), c1.getStar());
} else {
//monster
if(full) {
sortKey1 = getSortKey2(c1);
sortKey2 = getSortKey2(c2);
if (sortKey1 != sortKey2) {
//需要反转
return Integer.compare(sortKey1, sortKey2);
}
}
int rs = comp(c1.getStar(), c2.getStar());
//高星的在前面
int rs = comp(c2.getStar(), c1.getStar());
if (rs != 0) {
return rs;
}
rs = comp(c1.Attack, c2.Attack);
//高攻击的在前面
rs = comp(c2.Attack, c1.Attack);
if (rs != 0) {
return rs;
}
rs = comp(c1.Defense, c2.Defense);
//高防御的在前面
rs = comp(c2.Defense, c1.Defense);
if (rs != 0) {
return rs;
}
......@@ -128,4 +130,12 @@ public class CardSort implements Comparator<Card> {
}
return comp(c1.Code, c2.Code);
}
private boolean isSameType(Card c1, Card c2, CardType type){
return c1.isType(type) && c2.isType(type);
}
private boolean isSpecialType(Card c1) {
return c1.isType(CardType.Fusion) || c1.isType(CardType.Synchro) || c1.isType(CardType.Xyz) || c1.isType(CardType.Link);
}
}
......@@ -4,9 +4,11 @@ import android.content.Context;
import android.net.Uri;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.content.FileProvider;
import java.io.BufferedReader;
import java.io.Console;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
......@@ -18,6 +20,8 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.Constants;
public class FileUtils {
......@@ -40,6 +44,9 @@ public class FileUtils {
InputStreamReader in = null;
FileInputStream inputStream = null;
List<String> lines = new ArrayList<>();
if(encoding == null){
encoding = "utf-8";
}
try {
inputStream = new FileInputStream(file);
in = new InputStreamReader(inputStream, encoding);
......@@ -48,8 +55,8 @@ public class FileUtils {
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (Exception e) {
} catch (Throwable e) {
//ignore
} finally {
IOUtils.close(in);
IOUtils.close(inputStream);
......@@ -58,6 +65,9 @@ public class FileUtils {
}
public static boolean writeLines(String file, List<String> lines, String encoding, String newLine) {
if(encoding == null){
encoding = "utf-8";
}
FileOutputStream outputStream = null;
File tmp = new File(file + ".tmp");
boolean ok = false;
......@@ -115,7 +125,7 @@ public class FileUtils {
outputStream = new FileOutputStream(out);
copy(inputStream, outputStream);
} catch (Throwable e) {
Log.e("ygo", "copy file", e);
Log.e(Constants.TAG, "copy file", e);
return false;
} finally {
IOUtils.close(outputStream);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment