当前位置: 首页 > 知识库问答 >
问题:

如何从读取一系列存储箱中获取卡片类型

陆子默
2023-03-14

我试图从与该卡类型相关联的列表箱中获得一系列卡类型,但每当我运行代码时,卡类型被打印为空,我不确定我做错了什么

这是文本中的垃圾箱

400000000000,499999999999,visa
500000000000,599999999999,mc
400000000000,499999999999,visa
420008000000,420008999999,visadebit
420008000000,435000999999,visa
540008000000,599999999999,mc

每当我通过4111111111而不是获得签证时,我都会得到零分,

这就是我到目前为止所做的

package cardsystem;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class Solution {

    /**
     * An entity to hold bin range details. A bin range is a pair of 12 digit numbers that
     * mark the boundaries of the range which is maped to other bin range properties such
     * as a card type. The range boundaries are inclusive.
     */
    static final class BinRange {
        final String start;
        final String end;
        final String cardType;

        BinRange(String start, String end, String cardType) {
            this.start = start;
            this.end = end;
            this.cardType = cardType;
        }
    }


    //  I need a hashmap which hold index and CardType. Each index corresponding an interval (start-end).
    private static HashMap<Integer, String> cache = new HashMap<>();
    private static List<Long> startEndList = new ArrayList<>();

    interface CardTypeCache {
        /**
         * @param cardNumber 12 to 23 digit card number.
         * @return the card type for this cardNumber or null if the card number does not
         * fall into any valid bin ranges.
         */
        String get(String cardNumber);
    }

    /**
     * @param binRanges the list of card bin ranges to build a cache from.
     * @return an implementation of CardTypeCache.
     */
    public static CardTypeCache buildCache(List<BinRange> binRanges) {

        cache = new HashMap<>();

        for (int i = 0; i < binRanges.size(); i++) {
            cache.put(i, binRanges.get(i).cardType);
        }

        for (BinRange binRange : binRanges) {
            startEndList.add(Long.valueOf(binRange.start)); // Previously, Integer type used, I converted it to 'Long' type
            startEndList.add(Long.valueOf(binRange.end));
        }

        return new CardTypeCacheImpl();
    }

    static class CardTypeCacheImpl implements CardTypeCache {


        public String get(String cardNumber) {

            //Integer index = findIndexLinear(Long.valueOf(cardNumber));    // Linear Search
            Integer index = findIndexBinary(Long.valueOf(cardNumber));      // Binary Search
            return (index != -1) ? cache.get(index) : "null";
        }

        /**
         * Linear Search O(n)
         *
         * @param cardNumber, Searching an index which is between start-end .
         * @return an index. If not found, return -1.
         */
        private Integer findIndexLinear(Long cardNumber) {

            for (int i = 1; i < startEndList.size(); i += 2) {
                if (startEndList.get(i - 1) <= cardNumber && cardNumber <= startEndList.get(i)) {
                    return i / 2;
                }
            }
            return -1;
        }

        /**
         * Binary Search O(logn)
         *
         * @param cardNumber, Searching an index which is between start-end .
         * @return an index. If not found, return -1.
         */
        private Integer findIndexBinary(Long cardNumber) {

            int left = 0;
            int right = startEndList.size();

            while (left < right) {

                int mid = left + (right - left) / 2;

                if (mid % 2 == 0 && startEndList.get(mid) <= cardNumber && cardNumber <= startEndList.get(mid + 1)) { // right pair (start-end) of mid
                    return mid / 2;
                } else if (mid % 2 == 1 && startEndList.get(mid - 1) <= cardNumber && cardNumber <= startEndList.get(mid)) {  // left pair
                    return mid / 2;
                }

                if (cardNumber < startEndList.get(mid)) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return -1;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
        
        File text = new File("D:/dev/CardSystem/src/cardsystem/input.txt");

        try (final Scanner scanner = new Scanner(text)) {
            List<Solution.BinRange> binRanges = new ArrayList<>();
            
            /*
            4111111111111111
            400000000000,499999999999,visa
            500000000000,599999999999,mc
            */

            String cardNumber = scanner.next();
            scanner.nextLine();

            scanner.useDelimiter("[,\n]");

            while (scanner.hasNext()) {
                String start = scanner.next();
                String end = scanner.next();
                String cardType = scanner.next();
                binRanges.add(new Solution.BinRange(start, end, cardType));
                if (scanner.hasNextLine()) {
                    scanner.nextLine();
                }
            }

            Solution.CardTypeCache cache = Solution.buildCache(binRanges);
            if (cache != null) {
                bufferedWriter.write(String.valueOf(cache.get(cardNumber)));
            }
        }

        bufferedWriter.newLine();
        bufferedWriter.close();
    }
}

我做错了什么,抓耳挠腮了几个小时

共有1个答案

章翔宇
2023-03-14

打印输出时:

bufferedWriter.write(String.valueOf(cache.get(cardNumber)));

cardNumber是“4111111111”,您可以在其中一个范围内查找它。

4111 1111 1111 1111
4000 0000 0000

我想你的卡号超出了你文件中指定的每个范围。因此,您可以编辑您的文件,即。

从…起

400000000000,499999999999,visa
500000000000,599999999999,mc
400000000000,499999999999,visa
420008000000,420008999999,visadebit
420008000000,435000999999,visa
540008000000,599999999999,mc

4000000000000000,4999999999999999,visa
5000000000000000,5999999999999999,mc
4000000000000000,4999999999999999,visa
4200080000000000,4200089999999999,visadebit
4200080000000000,4350009999999999,visa
5400080000000000,5999999999999999,mc
 类似资料:
  • 问题内容: 我正在尝试在J2ME中创建音乐播放器。我想从手机存储器和存储卡中读取所有mp3文件,并将其添加到列表中。如何检索这些.mp3文件? 问题答案: 阅读本文档以浏览文件和文件夹 用于读取存储卡中的文件, 在许多设备中,您可以通过E:\搜索, 而对于电话存储器,则可以通过C:\搜索 请参阅以下链接以获取帮助 http://www.java2s.com/Code/Java/J2ME/FileC

  • 问题内容: 我正在尝试在J2ME中创建音乐播放器。我想从手机存储器和存储卡中读取所有mp3文件,并将其添加到列表中。如何检索这些.mp3文件? 问题答案: 阅读本文档以浏览文件和文件夹 用于读取存储卡中的文件, 在许多设备中,您可以通过E:\搜索, 而对于电话存储器,则可以通过C:\搜索 请参阅以下链接以获取帮助 http://www.java2s.com/Code/Java/J2ME/FileC

  • 我有一个JTable,我可以在其中添加具有几个属性的用户,如年龄、名称等。这起作用了,用户被添加到我的arraylist和JTable中。现在我想要的是,当我选择JTable行时,能够获得存储在用户的arrayList中的对象,以便我可以修改或删除它们。 有谁能帮我一下吗?谢谢!

  • 问题内容: 我在SD卡中有一个文件夹,其中包含几个文件。现在我需要获取该文件的名称。有人能知道如何获取存储在SD卡中的文件名吗? 任何帮助将是感激的。非常感谢。 问题答案: 将给您对应的SDCARD。然后,您只需要使用方法。 那应该是这样的: 注意事项:来自KitKat及以上版本,需要获得许可。

  •  KAG 中、游戏的存储/读取、是通过(*)「栞(标签)」进行的。( 对无法使用此标记的用户,请修改 MainWindow.tjs )。  关于书签的说明,也请参考一下 游戏存档文件相关 的内容。  很遗憾的是、KAG 内建的存储・读取功能还无法做到随时存档。而是需要作者自行在剧本档中加入允许存储标签、也就是必须要设定存储・读取的「场所」。(译注:KAGeXpress内建了自动存档点,在每次使用[

  • 问题内容: 我有一个文本文件,其中包含大约2,000,000行的大量数据。使用以下代码片段浏览文件很容易,但这不是我所需要的;-) 我只需要从文件中读取特定范围的行。有没有办法像这样(伪代码)指定开始和结束行?在选择范围之前,我想避免使用readLines()将所有行加载到内存中。 如果Groovy无法做到这一点,那么也欢迎使用任何Java解决方案:-) 问题答案: 我不认为有任何“魔术”方法可以