Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为字母顺序与字母顺序不同的字母字符制作比较器_Java_Char_Comparator - Fatal编程技术网

Java 如何为字母顺序与字母顺序不同的字母字符制作比较器

Java 如何为字母顺序与字母顺序不同的字母字符制作比较器,java,char,comparator,Java,Char,Comparator,我的问题是,我想比较一些不使用字母排序的字符。 这是我的顺序关系:Aorder并将查找[char1]与查找[char2]进行比较。一种解决方案是将字符放入列表并使用索引。首先,我创建了一个查找表,但我的项目经理不希望it@T.Sutter当然,你的项目经理应该告诉你他想要什么?使用枚举而不是字符不是更好吗?据我所知,您只想比较单个字符,而不是字符串。创建一个查找表char->order并将查找[char1]与查找[char2]进行比较。一种解决方案是将字符放入列表并使用索引。首先,我创建了一个查

我的问题是,我想比较一些不使用字母排序的字符。 这是我的顺序关系:A 我如何为这个创建一个比较器?我必须这样写所有的案例:

if (char1.equals(char2)) {
            return 0;
        } else if (char1.equals("A")) {
            return -1;
        } else if (char1.equals("B") && char2.equals("A")) {
            return 1;
        } else if (char1.equals("T")
                && (char2.equals("B") || char2.equals("A"))) {
            return 1;
        } else if (char1.equals("Q")
                && (char2.equals("T") || char2.equals("B") || char2
                        .equals("A"))) {
            return 1;
        } else if (char1.equals("C")
                && (char2.equals("Q") || char2.equals("T")
                        || char2.equals("B") || char2.equals("A"))) {
            return 1;
        } else if (char1.equals("D")
                && (char2.equals("C") || char2.equals("Q")
                        || char2.equals("T") || char2.equals("B") || char2
                            .equals("A"))) {
            return 1;
        } else if (char1.equals("E")
                && (char2.equals("D") || char2.equals("C")
                        || char2.equals("Q") || char2.equals("T")
                        || char2.equals("B") || char2.equals("A"))) {
            return 1;
        } else if (char1.equals("F")
                && (char2.equals("E") || char2.equals("D")
                        || char2.equals("C") || char2.equals("Q")
                        || char2.equals("T") || char2.equals("B") || char2
                            .equals("A"))) {
            return 1;
        }

在数组char[]或列表中按所需顺序存储字符

基于列表/数组中字符的索引进行比较


list.indexOfchar1-list.indexOfchar2

在数组char[]或列表中按所需顺序存储字符

基于列表/数组中字符的索引进行比较


list.indexOfchar1-list.indexOfchar2

有一个非常简单的解决方案:

首先将您的角色放入列表:

char[] arrayChars= {'A','B','T', ... };
 List<Character> sortedChars= new ArrayList<Character>();
for (char c : arrayChars) { // Arrays.asList won't work
    sortedChars.add(c);
}

有一个非常简单的解决方案:

首先将您的角色放入列表:

char[] arrayChars= {'A','B','T', ... };
 List<Character> sortedChars= new ArrayList<Character>();
for (char c : arrayChars) { // Arrays.asList won't work
    sortedChars.add(c);
}
我会这样做

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Compare {

    public static void main(String[] args) {

        final List<Character> reference = new ArrayList<Character>(
              Arrays.asList(new Character[] {'A','B','T','Q','C','D','E','F'}));

        Character[] toBeSorted = {'A','B','C','D','E','F','Q','T'};

        Comparator<Character> myComparator = new Comparator<Character>() {

            public int compare(Character o1, Character o2) {
                Integer i1 = reference.indexOf(o1);
                Integer i2 = reference.indexOf(o2);
                return i1.compareTo(i2);
            }

        };

        Arrays.sort(toBeSorted, myComparator);

        System.out.println(Arrays.asList(toBeSorted));

    }


}
我会这样做

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Compare {

    public static void main(String[] args) {

        final List<Character> reference = new ArrayList<Character>(
              Arrays.asList(new Character[] {'A','B','T','Q','C','D','E','F'}));

        Character[] toBeSorted = {'A','B','C','D','E','F','Q','T'};

        Comparator<Character> myComparator = new Comparator<Character>() {

            public int compare(Character o1, Character o2) {
                Integer i1 = reference.indexOf(o1);
                Integer i2 = reference.indexOf(o2);
                return i1.compareTo(i2);
            }

        };

        Arrays.sort(toBeSorted, myComparator);

        System.out.println(Arrays.asList(toBeSorted));

    }


}

如果要使用自定义字符顺序比较字符串,请创建,例如


如果要使用自定义字符顺序比较字符串,请创建,例如


整数N带有一个所谓的自然顺序。因此,您只需按照您想要实现的顺序,将您的内容放入一个由整数索引的列表中。然后,当需要比较2个字符时,您可以比较它们的索引,就这样

整数N带有一个所谓的自然顺序。因此,您只需按照您想要实现的顺序,将您的内容放入一个由整数索引的列表中。然后,当需要比较2个字符时,您可以比较它们的索引,就这样

最后,我使用String,但它可以很好地使用:

public class IndiceRepetitionComparator implements Comparator<String> {

    List<String> relationOrdre = Arrays.asList("A", "B", "T", "Q", "C", "D", "E", "F", "G", "H", "I", "J", "K",
            "L", "M", "N", "O", "P", "R", "S", "U", "V", "W", "X", "Y", "Z");

    @Override
    public int compare(String indiceRepetition1, String indiceRepetition2) {

        // même objet
        if (indiceRepetition1 == indiceRepetition2) {
            return 0;
        }

        if (indiceRepetition1 == null) {
            return -1;
        }

        if (indiceRepetition2 == null) {
            return -1;
        }

        return (relationOrdre.indexOf(indiceRepetition1) - relationOrdre.indexOf(indiceRepetition2) > 0) ? 1 : -1;
    }
}

谢谢您的帮助

最后,我使用了String,但它可以很好地使用:

public class IndiceRepetitionComparator implements Comparator<String> {

    List<String> relationOrdre = Arrays.asList("A", "B", "T", "Q", "C", "D", "E", "F", "G", "H", "I", "J", "K",
            "L", "M", "N", "O", "P", "R", "S", "U", "V", "W", "X", "Y", "Z");

    @Override
    public int compare(String indiceRepetition1, String indiceRepetition2) {

        // même objet
        if (indiceRepetition1 == indiceRepetition2) {
            return 0;
        }

        if (indiceRepetition1 == null) {
            return -1;
        }

        if (indiceRepetition2 == null) {
            return -1;
        }

        return (relationOrdre.indexOf(indiceRepetition1) - relationOrdre.indexOf(indiceRepetition2) > 0) ? 1 : -1;
    }
}


谢谢您的帮助

使用枚举而不是字符不是更好吗?据我所知,您只想比较单个字符,而不是字符串。创建一个查找表char->order并将查找[char1]与查找[char2]进行比较。一种解决方案是将字符放入列表并使用索引。首先,我创建了一个查找表,但我的项目经理不希望it@T.Sutter当然,你的项目经理应该告诉你他想要什么?使用枚举而不是字符不是更好吗?据我所知,您只想比较单个字符,而不是字符串。创建一个查找表char->order并将查找[char1]与查找[char2]进行比较。一种解决方案是将字符放入列表并使用索引。首先,我创建了一个查找表,但我的项目经理不希望it@T.Sutter当然,你的项目经理应该告诉你他想要什么?谢谢!看起来很简单,字符[]上没有索引。我必须使用ListOops,你是对的,修复了这很好。我昨天完成了代码谢谢!看起来很简单,字符[]上没有索引。我必须使用ListOops,你是对的,修复了这很好。我昨天完成了代码如果性能重要,不要使用LinkedList。使用ArrayList或更好的HashMap。@FrankPuffer为什么你认为ArrayList比LinkedList更快,可以使用它对列表进行顺序搜索?@Andreas:因为它很可能更好地利用硬件内存缓存。如果性能重要,不要使用LinkedList。使用ArrayList或更好的HashMap。@FrankPuffer为什么你认为ArrayList比LinkedList更快,可以用它对列表进行顺序搜索?@Andreas:因为它很可能更好地利用了硬件内存缓存。