Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 6

11
votes
answers
48 views
+10

Task on the number of iterations

There is a number N every iteration it becomes equal to (N*2)-1 I need to find out how many steps the number will be a multiple of the original N;

( 1≤ N ≤ 2 · 10 9 )

For example:

N = 7; count = 0

N_ = 7*2-1 = 13; count = 1; N_ % N != 0

N_ = 13*2-1 = 25; count = 2; N_ % N != 0

N_ = 25*2-1 = 49; count = 3; N_ % N == 0 

Answer is 3

if it is impossible to decompose in this way, then output -1

       #include <iostream> 
       using namespace std;

       int main(){
           int N,M,c;
           cin >> N;
           if (N%2==0) {
               cout << -1;
               return 0;
           }
           M = N*2-1;
           c = 1;
           while (M%N!=0){
               c+=1;
               M=M*2-1;
           }
           cout << c;
           return 0;
       }

It does not fit during (1 second limit). How to optimize the algorithm?

P.S All the answers indicated are optimized, but they don’t fit in 1 second, because you need to change the algorithm in principle. The solution was to use Euler's theorem.

沙发
+50

正如其他答案所暗示的那样,问题等同于找到 c ,使 pow(2,c)= 1 mod N 如果N是偶数,则这是不可能的,否则可能(如您的代码所暗示的那样)。

线性时间方法是:

  int c = 1; uint64_t m = 2; while(m!= 1){c + = 1; m =(2 * m)%N; } printf(“%d”,c);   

要在1秒内解决这个问题,我认为你不能使用线性时间算法。最糟糕的情况是 N 是素数大而且很大。例如1999999817,上面的代码在我的笔记本电脑上运行大约10秒钟。

相反,将 N 纳入其主要因素。求解 2 ^ c = 1 mod p ^ k 对于给定的素数幂,如果 k = 1 ,则解决方案是 c = p-1 k 更大时,细节非常混乱,但你可以在这里找到一个书面解决方案: https://math.stackexchange.com/questions/1863037/discrete-logarithm-modulo-powers-of-a-small-prime 对于给定的素数幂,如果 k = 1 ,则解决方案是 c = p-1 k 更大时,细节非常混乱,但你可以在这里找到一个书面解决方案: https://math.stackexchange.com/questions/1863037/discrete-logarithm-modulo-powers-of-a-small-prime

板凳
+40

问题是你溢出,int数据类型只有32位,溢出2 ^ 31-1,在这个问题你不需要保持M的实际值,你可以保持模数n。

  while(M%N!= 0){c + = 1; M = M * 2-1; M%= N}   

编辑:此外,你实际上不需要超过N次迭代来检查是否存在0 mod,因为N只有N个不同的mod并且它只是骑自行车。因此,如果没有0 mod,你还需要牢记这一点。

如果有溢出,那么测试就没有错误的答案,但我有一个与时间相关的错误 - yoloy 8月29日5:38

这当然是你迈出的一大步,但它并没有增加速度 - yoloy 8月29日5:39

@yoloy你怎么知道法官在收到错误答案之前没有放弃?这可能是也可能不是整个问题,但它是一个错误。 - user4581301 8月29日5:39

旁注:在M%= N的情况下,循环条件中的M%N基本上是冗余的。 - user4581301 8月29日5:40

当你溢出时,while循环不会结束,因为mod不会达到0,数字将变为负数并且继续溢出,这导致超出时间限制 - Malek Aug 29 at 5:42

地板
+20

毫无疑问,您的代码的主要问题是有符号整数溢出

每当 M时,我都会添加 M 的打印件已更改(即 cout&lt;&lt; M&lt;&lt; endl; )并给它输入29.这就是我得到的:

  57 113 225 449 897 1793 3585 7169 14337 28673 57345 114689 229377 458753 917505 1835009 3670017 7340033 14680065 29360129 58720257 117440513 234881025 469762049 939524097 1879048193 -536870911 -1073741823 -2147483647 1 1 1 ...无限循环  

如您所见,您已经签署了整数溢出。这是C中的未定义的行为,所以任何事情都可能发生!在我的机器上,我结束了一个讨厌的无限循环。在考虑性能之前必须先修复它。

简单的解决方法是添加一行,如

  M = M%N;   

每当 M 被更改时。请参阅@Malek的答案

除此之外,您还应使用无符号整数,即对所有变量使用 uint32_t

但是,这将提高性能。

如果在上述修复后仍有性能问题,您可以尝试这样做:

  uint32_t N; cin&gt;&gt; N; if(N%2 == 0){cout&lt;&lt; -1; 返回0; } //替代算法uint32_t R,c; R = 1; c = 1; 而(R!= N){R = 2 * R + 1; if(R> N)R = R-N; ++℃; } cout&lt;&lt; C;   

在我的笔记本电脑上,当测试1..100000范围内的所有奇数时,此算法的速度要快2.5倍。但是,对于1..2 * 10 ^ 9范围内的所有数字可能还不够。

还要注意使用 uint32_t 来避免整数溢出。

8
votes
answers
1.2 K views
+10

查找2d阵列中所有峰的高效算法

给定矩阵M的整数,峰值是数组中不小于其4个邻居(向上,向下,向左,向右)的元素。有一个很好的线性时间(n乘n矩阵的O(n))算法来找到一个峰值,例如在这些讲义或稍微简单的O(n log n)时间解决方案此代码

假设我想找到k个峰值,如果存在多个峰值。有没有办法在O(n + k)或O(n log n + k)时间内完成此操作?

沙发
+50

答案是否定的。如果 k&gt; 1 然后最糟糕的情况是 O(n ^ 2)

问题在于“如果存在多少”部分。当输入包含少于 k 峰值时,只有当我们确定要找到少于 k 的峰值时,我们的算法才能终止。我将证明(下面)我们只能确定如果我们在相邻元素之间执行 O(n ^ 2)比较,则会有少于 k 的峰值。

证明

为确保元素峰值,我们必须将其与至少 它的一个邻居 - 如果那个邻居恰好更大,那么该元素不是一个峰值。如果我们还没有将一个元素与它的任何一个邻居进行比较,那么它仍然可能是一个峰值,并且我们所做的每个比较最多只排除一个元素来自一个峰值。知道我们的输入中存在少于 k 的峰值相当于知道至少有 n ^ 2 - k + 1 非峰值,这要求我们有至少执行 n ^ 2 - k + 1 比较,即 O(n ^ 2)对于 k&gt; 1 存在&lt;的输入 k 达到峰值,因此在最坏的情况下,我们必须在停止搜索之前执行这些 O(n ^ 2)比较。

注意< / strong>:

k = 1 的情况不会出现此问题的原因是因为每个输入都保证至少有一个峰值。当我们找到第一个峰值时,我们会停止搜索,因此我们无需检查是否找不到更多峰值。

由于我不认为这是对问题的正确解释 - 至少对我来说这个问题是“如果至少有k个峰值,我们能否在O(nlogn + k)时间找到k个?” 如果事实证明我错了就会upvote。 - zw324 8月30日18:33

@myrtclecat如果你事先知道k峰存在怎么办? - 世俗主义滑雪8月30日18:34

回想起来-1是苛刻但投票被锁定: - / - zw324 8月30日18:42

板凳
+30

假设您有 NxN 矩阵 A 最初 A [i] [j] = i + j 只有一个高峰。它很容易找到它,但你试图尽可能快地找到两个峰值。问题是,恶意恶魔会看到你被允许更改你尚未访问过的单个元素的值。显然你无法快速找到第二个峰值,因为恶魔知道你的动作。

形式上,假设算法可以在矩阵中找到最多两个峰而不访问所有元素。 A [i] [j] = i + j 矩阵上运行它。它应该返回单个现有峰值。检查访问了哪些元素。将未访问的元素更改为 3 * N ,这使其成为新的峰值,并再次运行算法。它必须返回与之前相同的答案,现在这是不正确的。

所以答案是否定的。

如果只允许输入至少有k个峰值,那么相同类型的参数都可以工作,只需稍微更改一下。

假设一个算法可以找到两个峰值实际上,在访问 M&lt; N ^ 2 元素时,输入中存在两个或更多个峰值。WLOG我们可以假设,当呈现只有一个峰值的输入时,算法会访问所有元素(如果没有,我们总是可以修改它来执行此操作而不会失去快速处理具有两个峰值的输入的能力,例如切换到M访问后的暴力搜索)。 A [i] [j] = i + j 矩阵表示它。该算法将访问所有元素。注意最后访问了哪个元素并将其更改为峰值(如果最后一个元素峰值,则将第二个最后访问的元素更改为峰值)。再次运行算法。现在输入有两个峰值,但算法仍然需要访问所有元素才能找到它们。

由于我不认为这是对问题的正确解释 - 至少对我来说这个问题是“如果至少有k个峰值,我们能否在O(nlogn + k)时间找到k个?” 如果事实证明我错了就会upvote。 - zw324 8月30日18:36

回想起来-1是苛刻但投票被锁定: - / - zw324 8月30日18:41

@ zw324同样的论证适用于你对问题的解释,我会编辑答案然后你可以重新投票。 - nm 8月31日8:47

地板
0

我怀疑我错过了一些东西,因为对我来说,“是”答案似乎很明显。使用给定的算法查找峰值,但找不到时停止。相反,回溯; 继续寻找,直到你找到 k 的高峰,或者你已经用尽了你的分数&amp; 征服算法。

在某些病态情况下 - 例如导致已知峰值的几个起点 - 您可以通过安排搜索顺序来提高性能。当您向后追溯树然后在广度上移动时,请移动到相邻位置。而是移动到最远未搜索的节点。您可以使用 O(1)距离函数找到它,或者只是抓住一个足够远的距离,给定搜索树的级别(对子矩阵大小的一个很好的估计)。

我的思想的后台正在研究一个包含 k 不同峰值的矩阵,但使用这种方法可以很好地解决问题。二维迷宫设计的连通性提供了许多好的工具 - 这相当于从给定的起点找到迷宫路径。

到目前为止,我似乎有两个没有,一个是。 - Anush 8月30日16:07

这里有问题的部分是回溯。在窗口最大值位于边界上的情况下,您没有其他位置可以提前终止而不会找到所有可能的峰值。如果没有,您可能会回溯,以至于您将访问的不仅仅是O(n)子阵列。 - Nico Schertler 8月30日16:10

“像搜索失败一样回溯”搜索不会失败。总有一个高峰。这是算法的基本假设。删除它,它不再有效。 - nm 8月30日16:12

@nm写错了; 我正在思考,寻找已经通过另一条道路找到的高峰。修复... - 修剪8月30日16:14

如果没有找到k个峰值,那么这种方法如何知道在不访问(几乎)每个元素的情况下停止?在最坏的情况下,它似乎是O(n ^ 2),但如果输入通常包含至少k个峰值,它仍然可能是一个实用的解决方案。 - myrtlecat 8月30日16:15

0
votes
answers
51 views
+10

貓鼬填充不是爲我工作

0

我有這個架構用戶貓鼬填充不是爲我工作

var mongoose = require("mongoose"), 
    passportLocalMongoose = require("passport-local-mongoose"); 

mongoose.Promise = global.Promise; 

var userSchema = new mongoose.Schema ({ 
    username: {type: String, required: true, unique: true}, 
    password: {type: String}, 
    role: {type: String, required: true}, 
    confirmed: {type: Boolean, required: true, default: false}, 
    active: {type: Boolean, required: true, default: true}, 
    name: String, 
    created: {type: Date, default: Date.now}, 
    admin: {type: Boolean, default: false, required: true} 
}); 

userSchema.plugin(passportLocalMongoose); 

module.exports = mongoose.model("User", userSchema); 

而另一架構公司,其中客戶用戶數組:

var mongoose = require("mongoose"); 
mongoose.Promise = global.Promise; 

var companySchema = new mongoose.Schema ({ 
    name: {type: String, required: true, unique: true}, 
    created: {type: Date, default: Date.now}, 
    active: {type: Boolean, required: true, default: true}, 
    staff: [{ 
     id: { 
      type: mongoose.Schema.Types.ObjectId, 
      ref: "User" 
     }, 
     username: String 
    }], 
    clients: [{ 
     id: { 
      type: mongoose.Schema.Types.ObjectId, 
      ref: "User" 
     }, 
     username: String 
    }] 
}); 

module.exports = mongoose.model("Company", companySchema); 

我在我的路線下面的代碼,但用戶信息沒有被填充到公司對象,什麼是我做錯了?

// EDIT route 
router.get("/:company_id/edit", middleware.checkCompanyOwnership, function(req, res) { 
    Company.findOne({_id: req.params.company_id}).populate({path: 'clients'}).exec(function(err, company) { 
     if (err || !company) { 
      console.log(err); 
      req.flash("error", err.message); 
      res.redirect("/"); 
     } else { 
      console.log("Request to edit company."); 
      //console.log(company); 
      res.render("company/edit", {title: "Edit Company", company: company}); 
     } 
    }); 
}); 

這是,如果我的控制檯日誌公司什麼我得到:

{ _id: 5a070874b4292914444b6e06, 
    name: 'ABC', 
    __v: 1, 
    clients: 
    [ { username: '[email protected]', 
     _id: 5a070206616810129b5c876a } ], 
    staff: [], 
    active: true, 
    created: 2017-11-11T14:25:56.359Z } 

感謝您的幫助。

沙发
0
2

貴公司的模式應該是這樣的

var companySchema = new mongoose.Schema ({ 
    ... 
    staff: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }], 
    clients: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }] 
}); 

請參閱該文檔http://mongoosejs.com/docs/populate.html

0
votes
answers
51 views
+10

Django的模板,如果同一個標籤內的邏輯breckets和優先順序

1

在我的Django模板我有Django的模板,如果同一個標籤內的邏輯breckets和優先順序

{% if object_not_readonly and user_is_worker or user_is_admin %} 

Django的doc告訴我

使用兩個AND和OR子句條件允許,並且具有更高的優先級或者是

我覺得這在IF語句中聲明邏輯優先級的方式並不明顯。

問題是

是它像在Django模板語言{% if object_not_readonly and (user_is_worker or user_is_admin) %}條件,與像if A and (C or B) and (not Z)明顯的條款?

沙发
0
0

爲了絕對安全,我會分裂它是這樣的:

{% if object_not_readonly %} 
    {% if user_is_worker or user_is_admin %} 

     ... 

    {% endif %} 
{% endif %} 
+0

是的,我做到這一點。但它太複雜,並不明顯,我認爲 –

+0

我認爲是更清晰但ymmv,也不會需要更多的處理時間。 –

+0

嵌套'如果'是偉大的。但是,如果django開發人員執行復雜的條件,那麼看到它做得很好就會很酷 –

0
votes
answers
44 views
+10

找到行數的最快方法?

4

我現在使用什麼:找到行數的最快方法?

numlines := strings.Count(editor.Text(), "
") 
fmt.Print(strconv.Itoa(numlines)) 
message.SetText(strconv.Itoa(numlines)) 

這是每當一個文本框更新運行。最類似這樣做的方式是什麼?

沙发
0
4

這很好。但是請不要忘記,如果最後一個字符不是換行符,則必須將出現次數加1,因爲這將是行數(最後一行可能不會以換行符結束)。

我們可能會認爲,由於您要計算的子字符串只是一個字符(單個rune),因此我們可以創建一個自定義解決方案,僅計算此單個字符的出現(而不是計算子字符串)。它可能看起來像這樣:

func countRune(s string, r rune) int { 
    count := 0 
    for _, c := range s { 
     if c == r { 
      count++ 
     } 
    } 
    return count 
} 

(一種for rangestring值迭代其rune S)

並對其進行測試(試試在Go Playground):

fmt.Println(countRune("asdf
asdf
asdf
", '
')) // Prints 3 

在實踐中,這將不會更快地計算換行符,因爲這是UTF-8編碼中的單個byte,並且strings.Count()已針對子字符串的長度爲1:

// Count counts the number of non-overlapping instances of substr in s. 
// If substr is an empty string, Count returns 1 + the number of Unicode code points in s. 
func Count(s, substr string) int { 
    if len(substr) == 1 && cpu.X86.HasPOPCNT { 
     return countByte(s, byte(substr[0])) 
    } 
    return countGeneric(s, substr) 
} 

func countByte(s string, c byte) int // ../runtime/asm_amd64.s 

能改善一下這個操作的性能(計數線)是,如果你將有機會獲得「內部」字節或編輯的符陣,這樣你就不必調用其Text()方法,它創建並返回其內容的副本。

板凳
0
1

當您詢問有關最快方法的問題時,您應該使用Go testing軟件包基準設施進行測量。

例如,計數行數使用strings.Count並使用for range環在stringlorem ipsum中,並測量來自一個byte切片轉換爲string的任何額外費用。通過計算byte切片中的行數,您可以避免任何byte切片到string開銷。

$ gotest lines_test.go -bench=. 
data: /home/peter/shakespeare.pg100.txt 5589889 
BenchmarkStringCount-4  30000000 57.3 ns/op  0 B/op 0 allocs/op 
BenchmarkStringByRune-4  3000000 563 ns/op  0 B/op 0 allocs/op 
BenchmarkBytesToString-4 10000000 173 ns/op  480 B/op 1 allocs/op 
BenchmarkBytesCount-4  20000000 61.2 ns/op  0 B/op 0 allocs/op 

lines_test.go

package main 

import (
    "bytes" 
    "strconv" 
    "strings" 
    "testing" 
) 

func linesStringCount(s string) string { 
    n := strings.Count(s, "
") 
    if len(s) > 0 && !strings.HasSuffix(s, "
") { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

func linesStringByRune(s string) string { 
    n := 0 
    for _, r := range s { 
     if r == '
' { 
      n++ 
     } 
    } 
    if len(s) > 0 && !strings.HasSuffix(s, "
") { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

func linesBytesCount(s []byte) string { 
    nl := []byte{'
'} 
    n := bytes.Count(s, nl) 
    if len(s) > 0 && !bytes.HasSuffix(s, nl) { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

var data = []byte(`Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, 
sunt in culpa qui officia deserunt mollit anim id est laborum.`) 

func BenchmarkStringCount(b *testing.B) { 
    text := string(data) 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesStringCount(text) 
    } 
} 

func BenchmarkStringByRune(b *testing.B) { 
    text := string(data) 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesStringByRune(text) 
    } 
} 

func BenchmarkBytesToText(b *testing.B) { 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = string(data) 
    } 
} 

func BenchmarkBytesCount(b *testing.B) { 
    text := data 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesBytesCount(text) 
    } 
} 
0
votes
answers
42 views
+10

使用Firestore進行排序,分頁和過濾的角度材料數據表

1

我目前有一個表中正在填充來自Firestore的數據。我在執行排序,分頁和篩選時遇到了困難,我希望有人能夠爲我闡明這一點。以下是我的服務,組件和html。我看到了material.angular.io上的不同示例,但他們使用的示例數據庫將我拋棄。使用Firestore進行排序,分頁和過濾的角度材料數據表

服務:

import { Injectable } from '@angular/core'; 
import { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from 'angularfire2/firestore'; 
import { Account } from './../models/account.model'; 
import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class AccountService { 
    accountsCollection: AngularFirestoreCollection<Account>; 
    accounts: Observable<Account[]>; 

    constructor(public afs: AngularFirestore) { 
    this.accountsCollection = afs.collection('accounts'); 

    this.accounts = this.accountsCollection.snapshotChanges().map(changes => { 
     return changes.map(a => { 
     const data = a.payload.doc.data() as Account; 
     data.id = a.payload.doc.id; 
     return data; 
     }); 
    }); 
    } 

    getAccounts() { 
    return this.accounts; 
    } 

} 

組件:

import { Account } from './../../../models/account.model'; 
import { Component, ViewChild, OnInit } from '@angular/core'; 
import { DataSource } from '@angular/cdk/collections'; 
import { MatPaginator, MatSort } from '@angular/material'; 
import { Observable } from 'rxjs/Observable'; 
import { AccountService } from '../../../services/account.service'; 

@Component({ 
    selector: 'app-account-table', 
    templateUrl: './account-table.component.html', 
    styleUrls: ['./account-table.component.css'] 
}) 
export class AccountTableComponent implements OnInit { 
    dataSource = new AccountDataSource(this.accountService); 
    displayedColumns = [ 
    'salesStep', 
    'status', 
    'idn', 
    'hospital', 
    'state', 
    'regionalManager', 
    'accountExecutive', 
    'clientLiaison', 
    'gpo' 
    ]; 

    constructor(private accountService: AccountService) {} 

    ngOnInit() { 

    } 

} 

export class AccountDataSource extends DataSource<any> { 

    constructor(private accountService: AccountService) { 
    super(); 
    } 

    connect(): Observable<Account[]> { 
    return this.accountService.getAccounts(); 
    } 

    disconnect() {} 

} 

HTML:

<div class="example-header"> 
    <mat-form-field> 
    <input matInput #filter placeholder="Search"> 
    </mat-form-field> 
</div> 

<mat-card class="example-container"> 

    <mat-table #table [dataSource]="dataSource" matSort> 

    <!--- Note that these columns can be defined in any order. 
      The actual rendered columns are set as a property on the row definition" --> 

    <!-- Sales Step Column --> 
    <ng-container matColumnDef="salesStep"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> Sales Step </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.salesStep}} </mat-cell> 
    </ng-container> 

    <!-- Status Column --> 
    <ng-container matColumnDef="status"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> Status </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.status}} </mat-cell> 
    </ng-container> 

    <!-- IDN Column --> 
    <ng-container matColumnDef="idn"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> IDN </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.idn}} </mat-cell> 
    </ng-container> 

    <!-- Hospital Column --> 
    <ng-container matColumnDef="hospital"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> Hospital </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.hospital}} </mat-cell> 
    </ng-container> 

    <!-- State Column --> 
    <ng-container matColumnDef="state"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> State </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.state}} </mat-cell> 
    </ng-container> 

    <!-- Regional Manager Column --> 
    <ng-container matColumnDef="regionalManager"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> RM </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.regionalManager}} </mat-cell> 
    </ng-container> 

    <!-- Account Executive Column --> 
    <ng-container matColumnDef="accountExecutive"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> AE </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.accountExecutive}} </mat-cell> 
    </ng-container> 

    <!-- Client Liaison Column --> 
    <ng-container matColumnDef="clientLiaison"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> CL </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.clientLiaison}} </mat-cell> 
    </ng-container> 

    <!-- GPO Column --> 
    <ng-container matColumnDef="gpo"> 
     <mat-header-cell *matHeaderCellDef mat-sort-header> GPO </mat-header-cell> 
     <mat-cell *matCellDef="let row"> {{row.gpo}} </mat-cell> 
    </ng-container> 



    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> 
    <mat-row *matRowDef="let row; columns: displayedColumns;"> 
    </mat-row> 
    </mat-table> 

    <!-- <div class="example-no-results" 
     [style.display]="dataSource.renderedData.length == 0 ? '' : 'none'"> 
    No accounts found matching filter. 
    </div> --> 

    <mat-paginator #paginator 
       [length]="(accountService.accounts | async)?.length" 
       [pageIndex]="0" 
       [pageSize]="25" 
       [pageSizeOptions]="[5, 10, 25, 100]"> 
    </mat-paginator> 
</mat-card> 
+0

您可能需要將DataSource更改爲新的MatTableDataSource。 https://material2-docs-dev.firebaseapp.com/components/table/api#MatTableDataSource。務必升級到Angular 5和Material RC。我會把你的答案轉交給S.O.對於Firebase而言,現在它們大多已經過時。我也在爲今天的新設置而奮鬥。當我找到一個解決方案,它不會幫助你,因爲你有舊的表設置,似乎已被棄用。 – Preston

+0

我目前正在使用Angular 5和「@ angular/material」:「^ 2.0.0-beta.12」,但它看起來像我需要使用快照構建(npm install --save angular/material2-構建angular/cdk-builds)以正確訪問MatTableDataSource? – Kyle

+0

我剛完成安裝快照構建並使用MatTableDataSource實現了所有功能,它的功能就像一個魅力!非常感謝你! – Kyle

沙发
0
1

我能夠實現p通過安裝快照構建(npm install --save angular/material2-builds angular/cdk-builds)並使用MatTableDataSource進行混合,排序和過濾。有關如何使用此示例的示例:https://material2-docs-dev.firebaseapp.com/components/table/examples

0
votes
answers
39 views
+10

追加值,以陣列

3

我想追加的值的映射圖的內部陣列:追加值,以陣列

var MyMap map[string]Example 

type Example struct { 
    Id []int 
    Name []string 
} 

這裏是我嘗試,但我不能指向實施例的一個目的,以追加到陣列。

package main 


import (
    "fmt" 
) 


type Example struct { 
    Id []int 
    Name []string 
} 

func (data *Example) AppendExample(id int,name string) { 
    data.Id = append(data.Id, id) 
    data.Name = append(data.Name, name) 
} 

var MyMap map[string]Example 

func main() { 
    MyMap = make(map[string]Example) 
    MyMap["key1"] = Oferty.AppendExample(1,"SomeText") 
    fmt.Println(MyMap) 
} 
+0

我以爲我解決了這個問題,但我沒有解決它,因爲我需要分配循環中的鍵匹配值。 – Saem

沙发
0
4

你需要把它到地圖之前創建的實例結構的實例。

此外,您的映射會保留您的結構的副本,而不是根據MyMap定義的結構本身。嘗試在地圖中保留對您的示例結構的引用。

package main 

import "fmt" 

type Example struct { 
    Id []int 
    Name []string 
} 

func (data *Example) AppendOffer(id int, name string) { 
    data.Id = append(data.Id, id) 
    data.Name = append(data.Name, name) 
} 

var MyMap map[string]*Example 

func main() { 
    obj := &Example{[]int{}, []string{}} 
    obj.AppendOffer(1, "SomeText") 
    MyMap = make(map[string]*Example) 
    MyMap["key1"] = obj 
    fmt.Println(MyMap) 
} 

Pozdrawiam!

+0

是的,我做了完全一樣的事情,以及我無法找到如何做,而無需創建一個結構的對象。我會恢復我自己的答案。感謝您的輸入! – Saem

+0

不一樣。你仍然使用結構文字而不是地圖上的指針。請閱讀關於結構和指針的更多信息: https://gobyexample.com/pointers https://gobyexample.com/structs –

板凳
0
0

好吧,我解決了它通過創建一個示例對象,然後將值附加到其數組並將其分配給映射。

像這樣:

package main 


import (
"fmt" 
) 


type Example struct { 
    Id []int 
    Name []string 
} 

func (data *Example) AppendExample(id int,name string) { 
    data.Id = append(data.Id, id) 
    data.Name = append(data.Name, name) 
} 

var MyMap map[string]Example 

func main() { 

    var object Example 
    object.AppendExample(1,"SomeText") 

    MyMap = make(map[string]Example) 
    MyMap["key1"] = object 
    fmt.Println(MyMap) 
} 
0
votes
answers
24 views
+10

非平凡轉到使用(可能擊敗編譯)

1

我有一段代碼,是這樣的:非平凡轉到使用(可能擊敗編譯)

f += .001f; //Only needs to be executed when loop executes at least one iteration, but does no harm if incremented without entering the loop 
while(anIndex < aVaryingBoundary) { 
    if(something) { 
     //code 
     continue; 
    } 
    //more code 
} 

我發現,使這個代碼更有效的唯一方式(通過消除的F不必要的增量)是使用goto。

if(anIndex < aVaryingBoundary) { 
    f += .001f; 

loop: 
    if(something) { 
     //code 
     if(anIndex < aVaryingBoundary) { 
      goto loop; 
     } 
     else { 
      goto loop_end; 
     } 
    } 
    //more code 
    if(anIndex < aVaryingBoundary) { 
      goto loop; 
    } 
} 
loop_end: 

即使這是一個簡單的優化,我不認爲編譯器可以很容易地檢測到這一點。編譯器執行真的不重要嗎?

+0

爲什麼你使用'goto' - 這還帶走了方舟 –

+0

取而代之的是''在裏面if'循環goto',爲什麼不增加? –

+0

這是如何優化? – melpomene

沙发
0
3

是不是隻是

if (anIndex < aVaryingBoundary) { 
    f += .001f; 
    do { 
     if(something) { 
      //code 
      continue; 
     } 
     //more code 
    } while(anIndex < aVaryingBoundary); 
} 

+0

甚至作爲循環體,甚至可以使用if(something){/ * code * /} else {/ * more code * /}';不需要繼續。 –

+0

@JonathanLeffler我不小心從實際需要的時候就離開了那裏。 –

板凳
0
2

這樣你就不需要goto了,編譯器也許可以對它進行優化。

if(anIndex < aVaryingBoundary) { 
    f += .001f; 
    // Tag loop: 
    while (true) { 
     if(something) { 
      //code 
      if(anIndex < aVaryingBoundary) { 
       continue; 
      } 
      else { 
       break; 
      } 
     } 
     //more code 
     if(anIndex < aVaryingBoundary) { 
      continue; 
     } 
     break; 
    } 
} 
// Tag loop_end: 

主邏輯結構保持不變,但沒有更多goto s。

+0

也許是一個布爾變量而不是繼續和斷開。 –

+0

@EdHeal這需要更多的變化。 – iBug

+1

那麼什麼 - 它會使代碼更具可讀性 –

地板
0
0
if(anIndex < aVaryingBoundary) { 
    f += .001f; 

    while(anIndex < aVaryingBoundary) { 
     if(something) { 
      //code 
      if(anIndex < aVaryingBoundary) continue; 
      else break; 
     } 
     //more code 
    } 
} 
0
votes
answers
59 views
+10

擴展Django 1.11用戶模型

2

我正在嘗試解決如何擴展Django用戶模型以向用戶添加信息。我似乎無法得到它的工作。我究竟做錯了什麼? 可以在我正在擴展到的同一模型中使用外鍵嗎?你如何創建一個超級用戶,還是你必須通過python manage.py shell手動完成?擴展Django 1.11用戶模型

這裏是我到目前爲止的代碼:

class PersonModel(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    firstName = models.CharField(max_length=50) 
    lastName = models.CharField(max_length=50) 
    company = models.ForeignKey(CompanyModel, on_delete=models.CASCADE, null=True) 
    phone = models.ForeignKey(PhoneModel, on_delete=models.CASCADE, null=True) 
    email = models.EmailField(blank=True) 

    def __str__(self): 
     return '%s %s - %s - %s, %s' % (self.firstName, self.lastName, 
             self.company, self.phone, self.email 
             ) 

    class Meta: 
     ordering = ['firstName'] 
     verbose_name = "Customer Contact Information" 
     #verbose_name_plural = "Contacts" 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     PersonModel.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

UPDATE(決賽): 隨着raratiru的幫助下,我已經能夠得到大部分他同去的腳本。由於我的外鍵要求,我仍然很難創建一個超級用戶。

from django.contrib.auth.models import (
    AbstractBaseUser, 
    PermissionsMixin, 
    BaseUserManager, 
) 
from django.core.mail import send_mail 
from django.db import models 
from django.utils.translation import ugettext_lazy as _ 
from customers import models as customers_models 

class TravelModel(models.Model): 
    mileageRate = models.DecimalField(max_digits=4, decimal_places=3) 

    def __str__(self): 
     return '%s' % (self.mileageRate) 

    class Meta: 
     verbose_name = "Current Federal Milage Rate" 
     #verbose_name_plural = "Milage" 


class UserManager(BaseUserManager): 
    def create_user(self, email, firstName, lastName, company, phone, password=None, **kwargs): 
     email = self.normalize_email(email) 
     user = self.model(email=email, **kwargs) 
     user.firstName = firstName 
     user.lastName = lastName 
     user.company = company 
     user.phone = phone 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, firstName, lastName, password=None, **kwargs): 
     #user = self.create_user(**kwargs) 
     email = self.normalize_email(email) 
     user = self.model(email=email, **kwargs) 
     user.firstName = firstName 
     user.lastName = lastName 
     user.set_password(password) 
     user.is_superuser = True 
     user.is_staff = True 
     user.save(using=self._db) 
     return user 


class AliasField(models.Field): 
    def contribute_to_class(self, cls, name, virtual_only=False): 
     super().contribute_to_class(cls, name, virtual_only=True) 
     setattr(cls, name, self) 

    def __get__(self, instance, instance_type=None): 
     return getattr(instance, self.db_column) 


class MyUser(AbstractBaseUser, PermissionsMixin): 
     firstName = models.CharField(max_length=50, blank=False, null=False) 
     lastName = models.CharField(max_length=50, blank=False, null=False) 
     company = models.ForeignKey(customers_models.CompanyModel, on_delete=models.PROTECT, null=False) 
     phone = models.ForeignKey(customers_models.PhoneModel, on_delete=models.PROTECT, null=False) 

     email = models.EmailField(_('email address'), max_length=255, unique=True) 

     is_staff = models.BooleanField(
      _('staff status'), 
      default=False, 
      help_text=_(
        'Designates whether the user can log into this admin ' 
        'site.' 
      ) 
    ) 
     is_active = models.BooleanField(
      _('active'), 
      default=True, 
      help_text=_(
        'Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.' 
      ) 
    ) 
     username = AliasField(db_column='email') 

     objects = UserManager() 

     USERNAME_FIELD = 'email' 
     REQUIRED_FIELDS = ['firstName','lastName',] 

     class Meta(object): 
      ordering = ['firstName'] 
      verbose_name = _('Contact') 
      verbose_name_plural = _('Contacts') 

     def __str__(self): 
      return '%s - %s %s - %s - %s' % (self.company, self.firstName, self.lastName, self.email, self.phone) 

     def get_full_name(self): 
      return self.email 

     def get_short_name(self): 
      return self.email 

     def email_user(self, subject, message, from_email=None, **kwargs): 
      """ 
      Sends an email to this User. 
      """ 
      send_mail(subject, message, from_email, [self.email], **kwargs) 

規避外鍵的鬥爭中,最簡單的方法是創建超級用戶之前刪除空=假需求 - 公司和電話後分配 - 並設置空回假之後。

沙发
0
1

這就是我擴展我的用戶模型的方法。以下代碼也將用戶名替換爲電子郵件字段。我發佈它是因爲它引起了核心變化,因此它清楚了背後的邏輯。

基本想法可以在this post找到並解釋。一個非常好的帖子也可以找到here

在這種情況下,AliasField會將字段username作爲email的別名。儘管django已經記錄了proper way找到用戶模型及其相關字段,但這並不是必需的。

from django.contrib.auth.models import (
    AbstractBaseUser, 
    PermissionsMixin, 
    BaseUserManager, 
) 
from django.core.mail import send_mail 
from django.db import models 
from django.utils.translation import ugettext_lazy as _ 


class UserManager(BaseUserManager): 
    def create_user(self, email, password=None, **kwargs): 
     email = self.normalize_email(email) 
     user = self.model(email=email, **kwargs) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, **kwargs): 
     user = self.create_user(**kwargs) 
     user.is_superuser = True 
     user.is_staff = True 
     user.save(using=self._db) 
     return user 


class AliasField(models.Field): 
    def contribute_to_class(self, cls, name, private_only=False): 
     super().contribute_to_class(cls, name, private_only=True) 
     setattr(cls, name, self) 

    def __get__(self, instance, instance_type=None): 
     return getattr(instance, self.db_column) 


class MyUser(AbstractBaseUser, PermissionsMixin): 
    custom_field = models.ForeignKey(
     'app.Model', 
     on_delete=models.PROTECT, 
    ) 

    email = models.EmailField(_('email address'), max_length=255, unique=True) 

    is_staff = models.BooleanField(
     _('staff status'), 
     default=False, 
     help_text=_(
      'Designates whether the user can log into this admin ' 
      'site.' 
     ) 
    ) 
    is_active = models.BooleanField(
     _('active'), 
     default=True, 
     help_text=_(
      'Designates whether this user should be treated as ' 
      'active. Unselect this instead of deleting accounts.' 
     ) 
    ) 
    username = AliasField(db_column='email') 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['user_branch_key', ] 

    class Meta(object): 
     ordering = ['email'] 
     verbose_name = _('My User') 
     verbose_name_plural = _('My User') 

    def __str__(self): 
     return 'id: {0} - {1}, {2}'.format(self.id, self.email, self.user_branch_key) 

    def get_full_name(self): 
     return self.email 

    def get_short_name(self): 
     return self.email 

    def email_user(self, subject, message, from_email=None, **kwargs): 
     """ 
     Sends an email to this User. 
     """ 
     send_mail(subject, message, from_email, [self.email], **kwargs) 

一旦將文件./the_user/models.py在名爲the_user延長您的用戶模型,例如應用程序中,你必須做出的settings.py文件中的一些變化:

  • 註冊在INSTALLED_APPS應用
  • ./manage.py makemigrations & & ./manage.py migrate
  • 設置AUTH_USER_MODEL = 'the_user.MyUserthe docs

這樣描述的,在另一個模型,你可以添加一個外鍵如下:

from the_user.models import MyUser 
from django.conf import settings 
from django.db import models 

class AModel(models.Model) 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     on_delete=models.PROTECT, 
     related_name='%(app_label)s_%(class)s_user' 
    ) 
+0

好像而不是擴展,你重寫Django的用戶模型。這是一個比這個問題上的Django文檔更詳細的地獄:( – Jaberwocky

+0

@Jaberwocky的確。我正在尋找代碼來進行核心更改(使用電子郵件而不是用戶名),上面說明了用戶模型背後的邏輯 – raratiru

+0

我很感謝你的貢獻,我覺得這個問題不能完全回答我的問題,如果是的話,你會如何配合外鍵關係給用戶? 更精細的是,如果我想存儲什麼我在'PersonModel'中,如何使用你的方法完成這項工作? – Jaberwocky

0
votes
answers
56 views
+10

php7顯示存儲在mongodb中的文件3.4

0

我對php和mongodb很新。我已經在Ubuntu 16.04.3 LTS上安裝了php7.0和mongo 3.4.10。php7顯示存儲在mongodb中的文件3.4

我可以通過輸入蒙戈CLI命令顯示所需的文檔: db.testcollection.find({_id:'superid'}).pretty()

它給了我這樣的結果:

{ "_id" : "superid", "record" : "whatever" }

但我tryig與此PHP腳本顯示從MongoDB的集合文件:

<?php 

    $mongo = new MongoDBDriverManager(); 
    $filter = ['_id' => 'superid']; 
    $options = []; 
    $query = new MongoDBDriverQuery($filter, $options); 
    $rows = $mongo->executeQuery('db.testcollection', $query); 
    foreach ($rows as $document) { 
     print_($document); 
     var_dump($document); 
     echo $document; 
    } 

    echo "The END" 
    ?> 

這隻顯示「結束」。

我很想念我的PHP腳本同樣顯示蒙戈查詢結果爲CLI命令?

沙发
0
0

的問題是: 我創建了使用此命令在蒙戈外殼名爲test的新DATABSE:

use test; 
db.createCollection("testcollection"); 
db.testcollection.insert({ "_id" : "superid", "record" : "whatever"}); 

所以路徑分貝是test.testcollection不db.testcollection。

當我糾正相應的線路是這樣的:

$rows = $mongo->executeQuery('test.testcollection', $query); 

它按預期工作。

我被給出而不需要指定數據庫名稱(即使註銷蒙戈外殼並重新登錄)我正確的結果蒙戈外殼(CLI)混淆。

另一方面,你必須在php中指定dbname.collectionname(有意義):)