Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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表上类似SQL的查找?_Java_Sql - Fatal编程技术网

我使用什么来执行java表上类似SQL的查找?

我使用什么来执行java表上类似SQL的查找?,java,sql,Java,Sql,我有一个二维数组 public static class Status{ public static String[][] Data= { { "FriendlyName","Value","Units","Serial","Min","Max","Mode","TestID","notes" }, { "PIDs supported [01 – 20]:",null,"Binary","0",null,null,"1","0",null }, { "Online Monitors since

我有一个二维数组

public static class Status{
public static String[][] Data= {
{ "FriendlyName","Value","Units","Serial","Min","Max","Mode","TestID","notes" },
{ "PIDs supported [01 – 20]:",null,"Binary","0",null,null,"1","0",null },
{ "Online Monitors since DTCs cleared:",null,"Binary","1",null,null,"1","1",null },
{ "Freeze DTC:",null,"NONE IN MODE 1","2",null,null,"1","2",null },
我想

SELECT "FriendlyName","Value" FROM Data WHERE "Mode" = "1" and "TestID" = "2"

我该怎么做?最快的执行时间很重要,因为每分钟可能有数百个这样的时间。

想想它需要有多普遍。像SQL这样真正通用的解决方案可能与一些非常特定的查询的解决方案不太一样

正如您所介绍的,我倾向于避免使用字符串的2D数组,而是创建一个集合(可能是一个ArrayList,但如果您经常进行插入和删除操作,可能更适合使用LinkedList)来创建一个类似结构的类。所以

 List<MyThing> list = new ArrayList<MyThing>();
List List=new ArrayList();
并使用HashMap为要搜索的字段编制索引:

 Map<Integer, MyThing> modeIndex = new HashMap<Integer, MyThing>()
 for (MyThing thing : list)
     modeIndex.put(thing.mode, thing);
Map modeIndex=newhashmap()
用于(虚构事物:列表)
modeIndex.put(thing.mode,thing);

把它写下来让我意识到这本身是不行的,因为多个事物可能有相同的模式。所以可能是一个多重映射,或者通过使映射的值类型不是虚构的,而是列表来滚动自己的映射。有一个很好的多映射实现。

这并不能完全回答您的问题,但是可以运行一些Java RDBMs,将它们的表完全放在JVM的内存中。例如这将为您提供SQL选择的全部功能,而无需磁盘访问的开销。唯一的问题是,您不能像您所要求的那样查询原始Java数据结构。首先必须将数据插入数据库的内存表中

(我没有尝试过这个……也许有人可以评论一下这种方法是否真的可行。)

至于你的实际问题,在C语言中,他们通常使用(语言集成查询)来实现这一点,这得益于语言对查询的支持。现在,Java6是最新的官方版本,Java不支持闭包,但它将在即将发布的Java7中使用。基于Java7的LINQ等价物很可能是


至于您的实际问题,您肯定使用了错误的数据结构。您最好将
字符串[][]
转换为
列表
,并使用Carl Manaster建议的由提供的方便搜索/过滤API。这将是一个良好的开端。

编辑:我查看了您的阵列,我认为这绝对是RDBMS的一项工作。如果您想要类似内存数据结构的功能(快速/无需DB服务器),嵌入到诸如HSQLDB之类的内存数据库中,H2可以提供这些功能

如果你想要好的执行时间,你必须有一个好的数据结构。如果您只是将数据无序地存储在2D数组中,那么大部分情况下都会被O(n)所困扰

例如,您需要的是索引,就像其他RDBMS一样。例如,如果您使用大量的
WHERE
子句,如
WHERE name='Brian'和last_name='Smith'
,您可以执行类似的操作(类似于伪代码):

Set everyEntry=//包含所有数据的集合
Map indexedSet=newMap();
for(字符串名称:unionSetOfNames){
Set subset=Iterables.collect(新的HasName(name),everyEntries);
indexedSet.put(名称、子集);
}
//后来。。。
Set brians=indexedSet.get(“Brian”);
Entry target=Iterables.find(新的HasLastName(“史密斯”),brians);
(如果示例代码中的Guava API用法错误,请原谅我(这是伪代码,但你明白了)

在上面的代码中,您将执行一次O(1)查找,然后执行另一次O(n)查找,但查找的子集要小得多。因此,这可能比在整个集合上执行O(n)查找更有效,等等。如果使用按
姓氏排序的有序集合并使用二进制搜索,则该查找将变为O(logn).诸如此类。有很多数据结构,这只是一个非常简单的例子

总之,如果我是你,我将定义我自己的类,并使用JDK中可用的一些标准数据结构创建一个数据结构。如果这还不够,我可能会研究其他一些数据结构,但如果它变得非常复杂,我想我只会使用一些内存中的RDBMS,如HSQLDB或H2。它们很容易嵌入,所以有非常接近拥有自己的内存数据结构。随着越来越多的人从事复杂的工作,该选项可能会提供更好的性能


还请注意,我在示例代码中使用了该库。它们非常优秀,我强烈建议使用它们,因为它非常好。当然,也不要忘记查看java.utli.collections包。

我最终使用了一个查找表。90%的数据是从顶部附近引用的

    public static int lookupReferenceInTable (String instanceMode, String instanceTID){
        int ModeMatches[]=getReferencesToMode(Integer.parseInt(instanceMode));
        int lineLookup = getReferenceFromPossibleMatches(ModeMatches, instanceTID);
        return lineLookup;
    }



        private static int getReferenceFromPossibleMatches(int[] ModeMatches, String instanceTID) {
      int counter = 0;
      int match = 0;
      instanceTID=instanceTID.trim();
      while ( counter < ModeMatches.length ){
         int x = ModeMatches[counter];
         if (Data[x][DataTestID].equals(instanceTID)){
         return ModeMatches[counter];
         }
         counter ++ ;
      }
      return match;

    }
public static int lookupreferencetable(String instanceMode,String InstanceId){
int ModeMatches[]=getReferencesToMode(Integer.parseInt(instanceMode));
int lineLookup=getReferenceFromPossibleMatches(ModeMatches,instanceId);
返回行查找;
}
私有静态int getReferenceFromPossibleMatches(int[]ModeMatches,String instanceId){
int计数器=0;
int匹配=0;
InstanceId=InstanceId.trim();
while(计数器

它可以进一步优化,这样它就不会在所有数组中循环,而是在列上循环,直到找到匹配项,然后循环下一个,再循环下一个。数据以流动和组织良好的方式排列,因此基于3个条件的查找只需进行与行数相等的检查。

有什么原因不能执行吗是否使用数据库?HSQLDB和Derby都非常快速和轻便。
    public static int lookupReferenceInTable (String instanceMode, String instanceTID){
        int ModeMatches[]=getReferencesToMode(Integer.parseInt(instanceMode));
        int lineLookup = getReferenceFromPossibleMatches(ModeMatches, instanceTID);
        return lineLookup;
    }



        private static int getReferenceFromPossibleMatches(int[] ModeMatches, String instanceTID) {
      int counter = 0;
      int match = 0;
      instanceTID=instanceTID.trim();
      while ( counter < ModeMatches.length ){
         int x = ModeMatches[counter];
         if (Data[x][DataTestID].equals(instanceTID)){
         return ModeMatches[counter];
         }
         counter ++ ;
      }
      return match;

    }