我试图从与该卡类型相关联的列表箱中获得一系列卡类型,但每当我运行代码时,卡类型被打印为空,我不确定我做错了什么
这是文本中的垃圾箱
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();
}
}
我做错了什么,抓耳挠腮了几个小时
打印输出时:
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解决方案:-) 问题答案: 我不认为有任何“魔术”方法可以